簡體   English   中英

Mockito-彈簧單元測試

[英]Mockito - Spring unit tests

我一直在學習有關Java中Mockito框架的更多信息,而我不知道如何完成此單元測試。

基本上,來自控制台的錯誤指出,當嘗試從Foo測試運行Bar.sayHi()方法時,會出現NullPointerException。 我懷疑這與自動接線字段有關(但我可能錯了)?

以下是我遇到的問題的一個簡單示例:

@RunWith(MockitoJUnitRunner.class)
public class FooTest {

    @Mock
    //@Spy // Cannot spy on an interface
    IBar bar;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() {

        // Given 
        FooImpl foo = new FooImpl();
        foo.saySaySay();

        // When

        // Then

    }

}

這是正在測試的FooImpl類(Foo有一個接口):

public class FooImpl implements IFoo {

    @Autowired
    private IBar bar;

    public void saySaySay() {
        bar.sayHi();
    }

}

還有Bar類(還有Bar的接口):

public class BarImpl implements IBar {

    @Override
    public void sayHi() {
        System.out.println("hello");
    }

}

有人對此有建議嗎? 謝謝。

僅創建Ibar的模擬項不會將該模擬項注入@Autowired字段。 自動裝配是Spring的工作,而不是Mockito。 您需要顯式告訴mockito使用@InjectMock將其注入測試對象

@RunWith(MockitoJUnitRunner.class)
public class FooTest {
    @InjectMocks
    FooImpl foo;

    @Mock
    IBar bar;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    @Test
    public void test() {
        foo.saySaySay();
    }

}

或手動將模擬對象設置在測試對象中。

@Test
public void test() {
    FooImpl foo = new FooImpl();
    ReflectionTestUtils.setField(foo, "bar", bar);
    foo.saySaySay();    
}
RunWith(MockitoJUnitRunner.class)
public class FooTest {

    @Mock
    //@Spy // Cannot spy on an interface
    IBar bar;


    @InjectMocks
    private FooImpl foo;
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() {

        // Given 
        foo.saySaySay();
        verify(bar).sayHi();
        // When

        // Then

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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