2016-11-15 5 views
0

Я использую Jawin для доступа к приложению Windows, хотя COM. Мой код работает отлично. Я написал простой тест на Java, и он выполняется, как ожидалось. Однако, когда я аннотировать этот метод с использованием @Test и выполнить его с помощью среды JUnit код бросает COMException:Jawin и JUnit

org.jawin.COMException: 80020009: Failed to get item[src=OMTE.Projects.6,guid={C9FF8402-BB2E-11D0-8475-0080C82BFA0C}] 
at org.jawin.marshal.GenericStub.dispatchInvoke0(Native Method) 
at org.jawin.marshal.GenericStub.dispatchInvoke(GenericStub.java:201) 
at org.jawin.DispatchPtr.invokeN(DispatchPtr.java:587) 
at org.jawin.DispatchPtr.invokeN(DispatchPtr.java:555) 
at org.eclipse.epsilon.emc.ptcim.AttributeRelatedTests.getProject(AttributeRelatedTests.java:42) 
at org.eclipse.epsilon.emc.ptcim.AttributeRelatedTests.testModelId(AttributeRelatedTests.java:30) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runners.Suite.runChild(Suite.java:128) 
at org.junit.runners.Suite.runChild(Suite.java:27) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

Java код:

public static void main (String args[]) { 
     testModelId(); // try/catch was removed for better presentation 
} 

public static void testModelId() throws COMException { 
    Ole32.CoInitialize(); 
    DispatchPtr theProject = getProject("Traffic Lights"); 
    DispatchPtr model = load(theProject); 
    DispatchPtr rootItem = (DispatchPtr) model.invoke("Item", "Package", "Software"); 
    String strObjId = (String) rootItem.get("Property", "Id"); 
    assertEquals("80a27e73-0121-436a-abf7-1e01ebb33c7e", strObjId); 
} 


protected static DispatchPtr getProject(String name) throws COMException { 
    Ole32.CoInitialize(); 
    DispatchPtr app = new DispatchPtr("OMTE.Projects"); 
    String Role = "Project"; 
    DispatchPtr dispPtr = (DispatchPtr) app.invokeN("Item", new Object[] { 
      Role, name}); 
    DispatchPtr modelRef = new DispatchPtr(); 
    modelRef.stealUnknown(dispPtr); 
    return modelRef; 
} 

// load method is not included as the exception is thrown at getProject method 

JUnit код:

@Test 
public void testModelId() throws COMException { 
    Ole32.CoInitialize(); 
    DispatchPtr theProject = getProject("Traffic Lights"); 
    DispatchPtr model = load(theProject); 
    DispatchPtr rootItem = (DispatchPtr) model.invoke("Item", "Package", "Software"); 
    String strObjId = (String) rootItem.get("Property", "Id"); 
    assertEquals("80a27e73-0121-436a-abf7-1e01ebb33c7e", strObjId); 
} 


protected static DispatchPtr getProject(String name) throws COMException { 
    Ole32.CoInitialize(); 
    DispatchPtr app = new DispatchPtr("OMTE.Projects"); 
    String Role = "Project"; 
    DispatchPtr dispPtr = (DispatchPtr) app.invokeN("Item", new Object[] { 
      Role, name}); 
    DispatchPtr modelRef = new DispatchPtr(); 
    modelRef.stealUnknown(dispPtr); 
    return modelRef; 
} 

Первый запускается как приложение Java, второй - как тестовая конфигурация JUnit4.

+0

Да, тестовый код не кажется интересным, но вызовы: Пожалуйста, укажите, как вы называете метод тестера, чтобы он работал нормально, и как вы это называете через Junit, когда он терпит неудачу. –

+0

Я не уверен, что понимаю, что вы подразумеваете под вызовами. Я обновил исходный вопрос, хотя с кодом, я надеюсь, что это дает то, что вы просили. – Thanos

+0

Запуск приложения Java против запуска Junit. Хорошо: я предлагаю вам точно сравнить обе конфигурации, чтобы выяснить, есть ли какие-либо очевидные различия. –

ответ

0

Это то, что я сделал, и это то, что работает для меня:

Я попытался запустить те же тесты с другого компьютера с использованием конфигурации JUnit запуска, и они успешно. Было одно существенное различие между двумя машинами, то есть операционной системой (Windows 10 и Windows 7). На обеих машинах был установлен Eclipse Mars 2. Понижение моей операционной системы (из Windows 10, которая не работала на Windows 7, которая работала) была чрезмерной, поэтому я решил попробовать новую версию Eclipse, надеясь, что существует некоторая несовместимость между Win 10 + Eclipse Mars 2 + JUnit, которая была исправлена ​​в более новые версии. Действительно, те же тесты отлично работают в Eclipse Neon в Windows 10.

Из действий, предпринятых для решения проблемы, я понимаю, что Eclipse Mars 2 + Windows 10 (64bit) + JUnit при определенных обстоятельствах несовместимы (эти обстоятельства могут или не могут включать использование библиотеки Jawin 2.0 alpha).