События в джунит с Мокито - PullRequest
3 голосов
/ 20 июля 2011

Я пытаюсь протестировать javax.enterprise.event.Event, издевались над mockito, но выдается следующее исключение

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>

и включить Glassfish-Embedded-All перед зависимостью javax (javaee-web-api)

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

Что я сделал неправильно или что я неправильно понял?

Ответы [ 3 ]

3 голосов
/ 06 сентября 2011

Я сделал несколько небольших ошибок.Эта статья Адама Бина 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 (или макетировать).

0 голосов
/ 11 октября 2017

В качестве обходного пути я добавил внутренний класс, помеченный @Singleton, в моем тестовом классе, который действует как наблюдатель событий.Такой класс будет выглядеть так:

@Singleton
public static class MyEventObserver {
    MyEvent event;

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

И затем в моем тестовом классе я внедряю этот класс:

@Inject MyEventObserver observer;

и, наконец, в методе теста я сделаю что-то вроде:

Assert.assertNotNull(observer.event);

Это сработало для меня.

0 голосов
/ 20 июля 2011

Методы в TypeLiteral являются окончательными (см. документы ), что означает, что Mockito не может их издеваться (см. Mockito FAQ ).

Возможно, рассмотримиспользуя PowerMock (он может работать вместе с Mockito, я думаю), который, очевидно, может высмеивать финальные методы

...