簡體   English   中英

構造函數測試類中的Null模擬,帶有來自Mockito-junit-jupiter的MockitoExtension

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM