首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mockito的junit中的事件

使用Mockito的junit中的事件
EN

Stack Overflow用户
提问于 2011-07-20 18:46:34
回答 3查看 3.1K关注 0票数 4

我尝试测试由mockito模拟的javax.enterprise.event.Event,但是抛出了以下异常

代码语言:javascript
复制
Absent Code attribute in method that is not native or abstract in class file javax/enterprise/util/TypeLiteral

这个类看起来像

代码语言:javascript
复制
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项目)中

代码语言:javascript
复制
    <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

代码语言:javascript
复制
    <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>

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-06 17:11:52

我犯了一些小错误。Adam Bien的这篇文章Unit Testing for Java EE 为我指明了正确的方向。我删除了javaee-web-api依赖项,并添加了glassfish-embedded all依赖项。我的pom.xml看起来像这样:

代码语言:javascript
复制
    <!-- .... -->
    <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)。

票数 3
EN

Stack Overflow用户

发布于 2017-10-11 16:04:06

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

代码语言:javascript
复制
@Singleton
public static class MyEventObserver {
    MyEvent event;

    public void onMyEvent(@Observes MyEvent event) {
            this.event = event;
        }
    }
}

然后在我的测试类中注入这个类:

代码语言:javascript
复制
@Inject MyEventObserver observer;

最后,在测试方法中,我会这样做:

代码语言:javascript
复制
Assert.assertNotNull(observer.event);

这对我很有效。

票数 1
EN

Stack Overflow用户

发布于 2011-07-20 18:56:38

TypeLiteral中的方法是最终的(参见docs),这意味着Mockito不能模拟它们(参见Mockito FAQ)。

也许可以考虑使用PowerMock (我认为它可以与Mockito一起使用),它显然可以模拟最终方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6760671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档