我尝试测试由mockito模拟的javax.enterprise.event.Event,但是抛出了以下异常
Absent Code attribute in method that is not native or abstract in class file javax/enterprise/util/TypeLiteral这个类看起来像
public class MyClassTest {
@Mock Event<MyAlarm> event;
//...
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
//...
}
@Test
public void myTest() {
MyClass myClass = new MyClass();
myClass.event = event;
//...
verify(event, never()).fire(any(MyAlarm.class));
//...
}
}我将以下内容添加到pom.xml (maven项目)中
<repository>
<id>glassfish</id>
<name>GlassFish Maven Repository</name>
<url>http://maven.glassfish.org/content/groups/glassfish</url>
</repository>并在javax (javaee-web-api)依赖项前面包含glassfish-embedded all
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<type>jar</type>
<scope>provided</scope>
</dependency>我做错了什么,或者我误解了什么?
发布于 2011-09-06 17:11:52
我犯了一些小错误。Adam Bien的这篇文章Unit Testing for Java EE 为我指明了正确的方向。我删除了javaee-web-api依赖项,并添加了glassfish-embedded all依赖项。我的pom.xml看起来像这样:
<!-- .... -->
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.1</version>
<scope>provided</scope>
</dependency>
<!-- <dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>-->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.8.5</version>
<scope>test</scope>
<type>jar</type>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<!-- .... -->
<repositories>
<repository>
<url>http://download.java.net/maven/2/</url>
<id>java.net</id>
<layout>default</layout>
<name>java.net</name>
</repository>
</repositories>
这对我来说工作得很好,我可以测试java ee事件(或者mock-it out)。
发布于 2017-10-11 16:04:06
作为一种变通方法,我在测试类中添加了一个标记为@Singleton的内部类作为事件观察者。这样的类将如下所示:
@Singleton
public static class MyEventObserver {
MyEvent event;
public void onMyEvent(@Observes MyEvent event) {
this.event = event;
}
}
}然后在我的测试类中注入这个类:
@Inject MyEventObserver observer;最后,在测试方法中,我会这样做:
Assert.assertNotNull(observer.event);这对我很有效。
发布于 2011-07-20 18:56:38
TypeLiteral中的方法是最终的(参见docs),这意味着Mockito不能模拟它们(参见Mockito FAQ)。
也许可以考虑使用PowerMock (我认为它可以与Mockito一起使用),它显然可以模拟最终方法
https://stackoverflow.com/questions/6760671
复制相似问题