簡體   English   中英

在間諜對象上使用驗證

[英]Using verify on Spy object

我定義了一個間諜豆:

@Bean
public IMyService myServiceSpy()
{
    return Mockito.spy(new MyServiceImpl());
}

在我的測試中,我想捕獲服務獲得的參數。 當然,如果我將服務定義為模擬而不是間諜,那么它將起作用,但是我想激活服務的真實方法並繼續執行流程,因為我需要通過它計算返回值。

    @Inject
    private IMyService myServiceSpy;

    @Test
    public void myTest()
    {

    //act   
    //here invoking some service that will eventually invoke MyServiceImpl.

    //assert
    ArgumentCaptor<SomeObj> someObjCaptor = ArgumentCaptor.forClass(SomeObj.class);

    try
    {               
       Mockito.verify(myServiceSpy, Mockito.atLeastOnce()).create(someObjCaptor.capture());                 
    }
    catch(Exception e)
    {
        Assert.fail();
    }   
   assertEquals("some value" , someObjCaptor.getValue());

奇怪的是,當調用verify()時,間諜的方法再次被激活,但是這次使用NULL參數調用了該方法。

之后,斷言失敗

org.mockito.exceptions.base.MockitoException:  No argument value was captured! You might have forgotten to use argument.capture() in verify()... ...or you used capture() in stubbing but stubbed method was not called. Be aware that it is recommended to use capture() only with verify()

Examples of correct argument capturing:
    ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
    verify(mock).doSomething(argument.capture());
    assertEquals("John", argument.getValue().getName());

我正在使用以下代碼來運行測試:

@RunWith(SpringJUnit4ClassRunner.class)

我不完全確定您應該使用@Inject監視您的服務。

過去,這對我來說效果很好:

import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Spy;

import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.atLeastOnce;

...

@Spy
private MyServiceImpl myServiceSpy;

@Captor
private ArgumentCaptor<SomeObj> someObjCaptor;

@Test
public void myTest()
{

    ...

    try
    {               
       verify(myServiceSpy, atLeastOnce()).create(someObjCaptor.capture());

       SomeObj someObj = someObjCaptor.get();

       // Assert anything
    }
    catch(Exception e)
    {
        Assert.fail();
    }   

    ...

}

@Bean
public MyServiceImpl myServiceImpl()
{
    return new MyServiceImpl();
}

批注確實簡化了代碼。 一旦您習慣了它們,就可以更輕松地閱讀代碼並將其鍵入=)。

問題是由於我在本文中發現的Spring AOP:

https://lkrnac.net/blog/2015/12/mock-spring-bean-v2/

我通過創建將調用原始bean的新類來解決了該問題。 新類將在@Configuration類中偵聽。

public class MyServiceImplSpy implements IMyServiceImpl
{

    @Inject
    @Qualifier("myServiceImpl")  
    private IMyService myService;  //the original bean          

    public String create(SomeObj someObj)
    {
        return myService.create(someObj);
    }

}

暫無
暫無

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

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