哪个是 Mockito when(...).thenReturn(...) 在 JUnit5 中的正确位置?测试本身还是@BeforeClass/@BeforeEach 块?

问题描述

如果有以下区别,谁能解释一下:

@SpringBoottest
public class MyServiceMockTest {

    @Mock
    private MyRepository myRepository;

    @InjectMocks 
    private MyService myService = new MyServiceImpl();

    @BeforeEach
    void setMockOutput() {
        when(myRepository.get(anyString())).thenReturn("something fetched");
    }


    @Test
    void testGet() {
        assertEquals("something fetched",myService.get());
    }

}

还有这个:

@SpringBoottest
public class MyServiceMockTest {

@Mock
private MyRepository myRepository;

@InjectMocks 
private MyService myService = new MyServiceImpl();

@Test
void testGet() {
when(myRepository.get()).thenReturn("something fetched");
    assertEquals("something fetched",myService.get());
}

}

我明白,显然在第一种情况下 when(...).thenReturn() 将在每次测试之前运行,而在第二种情况下只会运行一次。但这是唯一的考虑吗?

另外,是否有必要让它运行多次?每种方法后我都应该做任何清理吗?

解决方法

不同之处在于,在第一个示例中,它将在每个测试之前运行,因此,如果不是只有一个测试方法,而是有多个测试方法,它将在每个测试之前执行。在你的情况下,我认为这没有任何区别。 目的是如果您希望类的每个测试方法都具有相同的配置,那么将它放在 BeforeEach 中而不是在每个方法中重复会更容易。 您应该只在需要时进行清理,这不是您总是或永远不必做的事情,这取决于具体情况。