我是JUnit5的新手,我注意到发生了一些奇怪的事情。
让我们看一个例子,
我有一个名为A的源类。
class A {
someDownStreamService service;
void printer() {
int getData = service.getIntegerData();
print(getData);
}
}
现在,当我编写测试用例时,
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class JUnit5TestCaseForClassA {
@Mock
private someDownStreamService service;
@InjectMocks
private A a;
@BeforeEach
setUp() {
initMocks(this);
Mockito.when(service.getIntegerData()).thenReturn(25);
}
@Test
void test1() {
a.printer();
}
@Test
void test2() {
Mockito.when(service.getIntegerData()).thenReturn(19);
a.printer();
}
}
当我分别触发test2()时,printer()函数将打印19,因为我认为Mockito.when()语句被覆盖以在test2()函数中返回19,而在@BeforeEach中注册的结果返回25。 / p>
当我在类“ JUnit5TestCaseForClassA”下执行所有测试类时,我看到printer()函数正在为这两个测试函数打印25。压倒一切没有发生吗?还是问题所在?
为什么会有这个差异?????
我可以看到制作@TestInstance(TestInstance.Lifecycle.METHOD)将解决此问题,因为每个测试用例都是由新的测试实例触发的。但是我想用Lifecycle.PER_CLASS进行测试。
答案 0 :(得分:0)
我对您的示例进行了一些稍微的修改,使其可测试(带有断言),如下所示。
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.mockito.InjectMocks;
import org.mockito.Mock;
@TestInstance(Lifecycle.PER_CLASS)
public class MockitoJUnitJupiterTestCase {
@Mock
MyService service;
@InjectMocks
A a;
@BeforeEach
void setUp() {
initMocks(this);
when(service.getData()).thenReturn(25);
}
@Test
void test1() {
assertEquals("data: 25", a.printer());
}
@Test
void test2() {
when(service.getData()).thenReturn(19);
assertEquals("data: 19", a.printer());
}
}
interface MyService {
int getData();
}
class A {
MyService service;
String printer() {
return "data: " + service.getData();
}
}
当我使用Mockito 2.23.4或2.28.2和JUnit Jupiter 5.5快照执行该测试时,测试通过。
您可以试一下这种测试变体,让我们知道在执行整个测试类时两个测试是否都通过了吗?