[英]Junit Jupiter: How can I change a mockito mock behavior cached in a List outside the test class?
[英]Null mock in the constructor test class with MockitoExtension from mockito-junit-jupiter
通過使用來自嘲諷@MockitoExtension
mockito-junit-jupiter
的@MockitoExtension
擴展, mockito-junit-jupiter
在測試類構造函數中為null。
使用的依賴項:
的Mockito-JUnit的木星:2.18.0
單元木星-API:5.1.1
我們可以僅使用一個模擬字段來重現該問題,但是測試構造函數下的對象對模擬的使用很好地說明了典型情況:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class FooTest {
@Mock
Bar mockBar;
Foo foo;
public FooTest() {
foo = new Foo(mockBar); // mockBar is null here
}
@Test
public void doThis() {
Mockito.when(mockBar.doThat())
.thenReturn(Mockito.anyInt());
// ...
}
}
結果,模擬對象正在四處走動,但與測試中的Foo
對象無關。
為什么呢 有什么解決方法?
解決方案1:
用@InjectMocks
代替構造函數初始化:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.InjectMocks;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class FooTest {
@Mock
Bar mockBar;
@InjectMocks
Foo foo;
@Test
public void doThis() {
Mockito.when(mockBar.doThat())
.thenReturn(Mockito.anyInt());
// ...
}
}
這@InjectMocks
但是使用@InjectMocks
也是一個趣味問題,因為如果所有注入策略均失敗,則Mockito將不會報告失敗。
不需要注射可能會惹惱您。 如果是這樣,您可以使用下一種方法。
解決方案2:
用@BeforeEach
注釋的方法替換構造函數初始化:
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class FooTest {
@Mock
Bar mockBar;
Foo foo;
@BeforeEach
public void beforEach() {
foo = new Foo(mockBar);
}
@Test
public void doThis() {
Mockito.when(mockBar.doThat())
.thenReturn(Mockito.anyInt());
// ...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.