3

我是 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 进行测试。

4

1 回答 1

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

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

于 2019-06-05T10:46:24.197 回答