我使用Jawin通过COM访问Windows应用程序。我的代码工作正常。我用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测试配置运行。
是的,测试代码似乎并不令人感兴趣,但是调用的确如此:请指定如何调用测试器方法以使其正常工作,以及在失败时如何通过Junit调用它。 –
我不确定我是否明白你的意思是通过调用。我用代码更新了原始问题,我希望这可以提供你所问的问题。 – Thanos
Java应用程序运行与Junit运行。那么:我建议你比较两种配置的准确性,找出是否有明显的差异。 –