2016-11-15 6 views
0

COM을 통해 Windows 응용 프로그램에 액세스하려면 Jawin을 사용하고 있습니다. 내 코드가 잘 작동합니다. Java로 간단한 테스트를 작성했으며 예상대로 실행됩니다.Jawin and 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) 

자바 코드 :

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; 
} 

I는 @Test을 사용하여이 방법을 주석과의 JUnit 환경을 통해 실행할 때, 코드는 COMException을 던진다 첫 번째는 Java 응용 프로그램으로 실행되고 두 번째는 JUnit4 테스트 구성으로 실행됩니다.

+0

예, 테스팅 코드가 재미 있지는 않지만 호출은 다음과 같습니다. 테스터 메소드를 호출하여 올바르게 작동하도록 지정하고, 실패하면 Junit을 통해 호출하는 방법을 지정하십시오. –

+0

호출로 무엇을 의미하는지 잘 모르겠습니다. 코드로 원래의 질문을 업데이트했지만,이 질문이 귀하가 요청한 내용을 제공하기를 바랍니다. – Thanos

+0

Java 응용 프로그램 실행과 Junit 실행. 정확히 두 구성을 비교하여 명백한 차이점이 있는지 알아 보는 것이 좋습니다. –

답변

0

이것은 내가 무슨 짓을하고이 나를 위해 일 것입니다 :

내가 JUnit을 실행 구성을 사용하여 다른 컴퓨터에서 같은 테스트를 실행 시도가 성공적으로 실행. 두 시스템 (운영 체제 (Windows 10 vs Windows 7)) 간에는 한 가지 중요한 차이점이있었습니다. 두 기계 모두 Eclipse Mars 2를 설치했습니다. 내 OS를 다운 그레이드 (Windows 10에서 작동하지 않는 Windows 7에서 작동 중임)하는 것은 잔인한 일 이었으므로 새로운 Eclipse 버전을 사용하기로 결정했습니다. Win 10 + Eclipse Mars 2 + JUnit 사이에 호환성 문제가 있었으면합니다. 최신 버전. 사실, 똑같은 테스트가 Windows 10의 Eclipse Neon에서 완벽하게 실행됩니다.

문제점을 해결하기 위해 취해진 조치에서 Eclipse Mars 2 + Windows 10 (64 비트) + JUnit은 특정 상황에서 호환되지 않습니다 이러한 상황은 라이브러리 Jawin 2.0 alpha 사용과 관련이있을 수도 있고 그렇지 않을 수도 있습니다.