与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;
    //...
    @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 (javae -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>

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

我犯了一些小错误。本文是Java EE的单元测试Adam Bien的书给我指明了正确的方向。我删除了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事件(或模拟出来)。

作为解决方案,我所做的是在我的测试类中添加一个标记为@Singleton的内部类,作为事件观察者。这样的类应该是这样的:

@Singleton
public static class MyEventObserver {
    MyEvent event;
    public void onMyEvent(@Observes MyEvent event) {
            this.event = event;
        }
    }
}

然后在test类中注入这个类:

@Inject MyEventObserver observer;

,最后在test方法中,我将这样做:

Assert.assertNotNull(observer.event);

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

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

相关内容

  • 没有找到相关文章

最新更新