gpt4 book ai didi

java - 无需使用 easymock 注入(inject)模拟

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:02:28 26 4
gpt4 key购买 nike

我想使用 easymock 3.5 和 JUnit5 编写一个小示例,但是在尝试注入(inject)模拟时出现错误 (nullPointerException)...

这是测试代码:

package model;

import controler.BookEditor;
import org.easymock.EasyMockRule;
import org.easymock.EasyMockSupport;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Before;
import org.junit.Rule;
import org.junit.jupiter.api.Test;
import view.BookWindow;

import static org.junit.jupiter.api.Assertions.assertEquals;

//@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class BookTest extends EasyMockSupport {

@Rule
public EasyMockRule rule = new EasyMockRule(this);


@Mock
public BookWindow bookWindow;

public BookList bookList;

@TestSubject
public BookEditor bookEditor;

@Before
public void setUp() {
bookList = new BookList();
bookEditor = new BookEditor(bookList, bookWindow);
}

@Test
public void testBookCreation() {

Book le_livre_de_la_jungle = new Book("Le livre de la jungle", "Rudyard Kipling",
"Flammarion",
"978-2081263246");
assertEquals(le_livre_de_la_jungle.getTitle(), "Le livre de la jungle");
assertEquals(le_livre_de_la_jungle.getAuthor(), "Rudyard Kipling");
assertEquals(le_livre_de_la_jungle.getEditor(), "Flammarion");
assertEquals(le_livre_de_la_jungle.getISBN(), "978-2081263246");

}


@Test
public void testDisplayBook() {
bookWindow.setTitle("Le livre de la jungle"); //here is line 53
bookWindow.setAuthor("Rudyard Kipling");
bookWindow.setEditor("Flammarion");
bookWindow.setISBN("978-2081263246");
replayAll();

bookEditor.setActiveBook(new Book("Le livre de la jungle",
"Rudyard Kipling", "Flammarion", "978-2081263246"));
verifyAll();

}

第一次测试没问题,但是 testDisplayBook 失败了,因为 bookWindow 为 null。

在我的 POM 中,我有这个:

<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>4.12.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.5</version>
<scope>test</scope>
</dependency>

</dependencies>

这里是个异常(exception):

java.lang.NullPointerException at model.BookTest.testDisplayBook(BookTest.java:53) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:389) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:167) at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:163) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:83) at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)

谢谢。

最佳答案

在 JUnit 5 中,Rules 不能再使用了。你必须 use an Extension并用 ExtendWith 注释测试类或方法。此外,您必须使用 @BeforeEach 而不是 @Before ( See also the migration section in the user guide )。

更新:从 EasyMock 4.1 开始,EasyMock 附带一个 JUnit 5 extension开箱即用。

据我所知还没有正式的 EasyMock 扩展。 幸运的是 EasyMockRule 可以很容易地移植:

import org.easymock.EasyMockSupport;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.TestInstancePostProcessor;

public class EasyMockExtension implements TestInstancePostProcessor {

@Override
public void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception {
EasyMockSupport.injectMocks(testInstance);
}
}

现在您可以注释您的测试类了:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;

// ...

@ExtendWith(EasyMockExtension.class)
public class BookTest extends EasyMockSupport {

@Mock
public BookWindow bookWindow;

public BookList bookList;

@TestSubject
public BookEditor bookEditor;

@BeforeEach
public void setUp() {
bookList = new BookList();
bookEditor = new BookEditor(bookList, bookWindow);
}

// ...

关于java - 无需使用 easymock 注入(inject)模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47243430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com