gpt4 book ai didi

junit - 覆盖本地函数中的 Mockito 语句不适用于 PER CLASS 模式?

转载 作者:行者123 更新时间:2023-12-05 07:22:41 25 4
gpt4 key购买 nike

我是 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。

当我执行“JUnit5TestCaseForClassA”类下的所有测试类时,我看到 printer() 函数正在为这两个测试函数打印 25。覆盖没有发生吗?或者是什么问题?

为什么会出现这种差异?????

我可以看到制作@TestInstance(TestInstance.Lifecycle.METHOD) 将解决问题,因为每个测试用例都由新的测试实例触发。但我想用 Lifecycle.PER_CLASS 进行测试。

最佳答案

我稍微修改了您的示例,使其可测试(使用断言)如下。

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 快照执行该测试时,测试通过了。

您能否尝试这种测试变体,并让我们知道在执行整个测试类时两个测试是否都通过了?

关于junit - 覆盖本地函数中的 Mockito 语句不适用于 PER CLASS 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56438868/

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