Events 在junit中使用Mockito的事件

Events 在junit中使用Mockito的事件,events,junit,java-ee-6,mockito,Events,Junit,Java Ee 6,Mockito,我试图测试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; //...

我试图测试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));
        //...
    }
}
公共类MyClassTest{
@模拟事件;
//...
@以前
公共作废设置(){
initMocks(this);
//...
}
@试验
公共无效myTest(){
MyClass MyClass=新的MyClass();
myClass.event=事件;
//...
验证(event,never()).fire(any(MyAlarm.class));
//...
}
}
我将以下内容添加到pom.xml(maven项目)


玻璃鱼
GlassFish Maven仓库
http://maven.glassfish.org/content/groups/glassfish
并在javax(javaeewebapi)依赖项前面嵌入glassfish

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

org.glassfish.extras
玻璃鱼嵌入所有
3.1
测试
爪哇
javaeewebapi
6
罐子
假如

我做错了什么或误解了什么?

TypeLiteral中的方法是最终的(请参阅),这意味着Mockito不能对它们进行模拟(请参阅)


也许可以考虑使用(它可以和Mockito一起工作),这显然可以模拟最后的方法

p>我犯了一些小错误。亚当·边的这篇文章为我指明了正确的方向。 我删除了javaeewebapi依赖项,并添加了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>

org.glassfish.extras
玻璃鱼嵌入所有
3.1.1
假如
org.mockito
莫基托磁芯
1.8.5
测试
罐子
朱尼特
朱尼特
4.8.2
测试
http://download.java.net/maven/2/
java.net
违约
java.net


这对我来说很好,我可以测试JavaEE事件(或模拟它)。

作为一种解决方法,我所做的是在我的测试类中添加一个标记为
@Singleton
的内部类,作为事件观察者。这样的类将如下所示:

@Singleton
public static class MyEventObserver {
    MyEvent event;

    public void onMyEvent(@Observes MyEvent event) {
            this.event = event;
        }
    }
}
然后在我的测试类中,我注入了这个类:

@Inject MyEventObserver observer;
最后,在测试方法中,我会做一些类似的事情:

Assert.assertNotNull(observer.event);

这对我很有用。

当我删除第二个依赖项时,我无法构建我的项目。所有Java EE函数(javax.*)都不再被识别。因此,据我所知,在使用Mockito的类中不可能模拟
javax.enterprise.event.event
。模拟通过提供方法的虚拟实现来工作,但如果这些方法被指定为final,它就不能这样做。
Assert.assertNotNull(observer.event);