Java 如何用Mockito编程void方法的行为?

Java 如何用Mockito编程void方法的行为?,java,junit,mocking,mockito,Java,Junit,Mocking,Mockito,我有一个类似这样的控制器类 public void create(int a, int b){ //do something } Controller ctrlMock = mock(Controller.class); //PseudoCode: when(isCalled(ctrlMock.create(a,b)).doCall(doCustomCreate()); 现在,我想模拟控制器类,并在调用模拟控制器类的create方法时调用exmaple doCustomCreate

我有一个类似这样的控制器类

public void create(int a, int b){
     //do something
}
Controller ctrlMock = mock(Controller.class);
//PseudoCode: when(isCalled(ctrlMock.create(a,b)).doCall(doCustomCreate());
现在,我想模拟控制器类,并在调用模拟控制器类的create方法时调用exmaple doCustomCreate()的某个方法

我的测试应该是这样的

public void create(int a, int b){
     //do something
}
Controller ctrlMock = mock(Controller.class);
//PseudoCode: when(isCalled(ctrlMock.create(a,b)).doCall(doCustomCreate());
我只读过关于使用输入和返回值的模拟方法,所以我想知道这是否可能


编辑:更新了问题

,因此您希望覆盖某个方法的模拟行为。解决方案是使用所谓的spy(也称为部分模拟)而不是模拟:

因此您希望覆盖某个方法的模拟行为。解决方案是使用所谓的spy(也称为部分模拟)而不是模拟:

只需将此API用于void方法:

doAnswer(doCustomCreate()).when(ctrlMock).create(a,b);
或者使用
BDDMockito

willAnswer(doCustomCreate()).given(ctrlMock).create(a,b);
其中
doCustomCreate()。注意:我使用了
Void
来表示这个答案不返回任何内容

public Answer<Void> doCustomCreate() {
    return new Answer<Void>() {
        public Void answer(InvocationOnMock invocation) {
            // your stuff
            return null;
        }
    }
}
public Answer doCustomCreate(){
返回新答案(){
公共无效应答(调用锁调用){
//你的东西
返回null;
}
}
}

注:为模拟提供行为在某种程度上是测试可维护性的一条艰难之路,因为这意味着测试的组件不是在纯受控环境/隔离中测试的。

只需将此API用于无效方法:

doAnswer(doCustomCreate()).when(ctrlMock).create(a,b);
或者使用
BDDMockito

willAnswer(doCustomCreate()).given(ctrlMock).create(a,b);
其中
doCustomCreate()。注意:我使用了
Void
来表示这个答案不返回任何内容

public Answer<Void> doCustomCreate() {
    return new Answer<Void>() {
        public Void answer(InvocationOnMock invocation) {
            // your stuff
            return null;
        }
    }
}
public Answer doCustomCreate(){
返回新答案(){
公共无效应答(调用锁调用){
//你的东西
返回null;
}
}
}

注:为模拟提供行为在某种程度上是测试可维护性的一条艰难之路,因为这意味着测试组件不是在纯受控环境/隔离中测试的。

列表是模拟对象的私有字段。你为什么关心它包含什么?似乎你想让mock做它不会被模仿的事情。谷歌“mockitovoid方法”,首先result@JBNizet实际上,从技术上讲,它是一个受保护的包级别。Thoguh我怀疑它在作者代码中是否真的被这样使用了。看起来你试图使用一个mock来达到一个不同的目的,而不是它真正的目的。请你再解释一下你想测试什么好吗?@Ray为什么?我使用Mockito的目的与Mockito的设计完全相同。列表是Mockito对象的私有字段。你为什么关心它包含什么?似乎你想让mock做它不会被模仿的事情。谷歌“mockitovoid方法”,首先result@JBNizet实际上,从技术上讲,它是一个受保护的包级别。Thoguh我怀疑它在作者代码中是否真的被这样使用了。看起来你试图使用一个mock来达到一个不同的目的,而不是它真正的目的。请你再解释一下你想测试什么好吗?@Ray为什么?我使用Mockito的目的与Mockito的设计完全相同。不,这与我想做的相反。我不想调用真正的方法,因为我需要一个mock做什么?我想调用我自己的方法。如果要替换“when(mock.someMethod()).thenCallRealMethod();”通过“when(mock.someMethod()).thenCallMyCustomMethod();”那么它将是合乎逻辑的。不,这与我想做的相反。我不想调用真正的方法,因为我需要一个模拟吗?我想调用我自己的方法。如果要替换“when(mock.someMethod()).thenCallRealMethod();”通过“when(mock.someMethod()).thenCallMyCustomMethod();”这样就合乎逻辑了。这可能是我要找的,我会试试看。@Gobliins我更新了答案以获得更完整的使用信息。这可能是我要找的,我会试试看。@Gobliins我更新了答案以获得更完整的使用信息。