Junit 使用Mockito验证测试接口

Junit 使用Mockito验证测试接口,junit,mockito,assert,Junit,Mockito,Assert,我试图测试一个类,它有一个带有3参数方法的接口。 我测试的方法是这样的 formElementCallback.stateChanged(formElement1, FormElementState.DISABLED, ""); formElementCallback.stateChanged(formElement2, FormElementState.DISABLED, null); 这就是测试方法 Mockito.verify(mockFormElementCallback, Mocki

我试图测试一个类,它有一个带有3参数方法的接口。 我测试的方法是这样的

formElementCallback.stateChanged(formElement1, FormElementState.DISABLED, "");
formElementCallback.stateChanged(formElement2, FormElementState.DISABLED, null);
这就是测试方法

Mockito.verify(mockFormElementCallback, Mockito.atLeastOnce()).stateChanged(Mockito.argThat(new ArgumentMatcher<FormElement>() {
            @Override
            public boolean matches(Object argument) {
                //matcher for formObject
                FormElement formElement = (FormElement) argument;
                return true;
            }
        }), Mockito.argThat(new ArgumentMatcher<FormElementState>() {
            @Override
            public boolean matches(Object argument) {
                //matcher for state
                return true;
            }
        }), Mockito.argThat(new ArgumentMatcher<Comparable>() {
            @Override
            public boolean matches(Object argument) {
                //matcher for value
                return true;
            }
        }));

编辑:解决方案不能是将3个参数合并为一个,并将状态和值放入formElement类中。这是因为防止外部类访问formElement本身并手动更改状态。还有另一个类似的实现:。stateChangedFormElementType类型,FormElementState状态,可比较值

你能这样断言吗

If argument equals formElement1, Assert state DISABLED, Assert value ""
If argument equals formElement2, Assert state DISABLED, Assert value null
Else AssertTrue(false) since interface must not be called with other form elements.
verify(formElementCallback).stateChanged(
    formElement1, FormElementState.DISABLED, "");
verify(formElementCallback).stateChanged(
    formElement2, FormElementState.DISABLED, null);
verifyNoMoreInteractions(formElementCallback);

看。如果这很重要,您也可以这样做。

否,正如我之前在这样验证时所说的,第一次验证失败是因为调用stateChangedformElement2,DISABLED,第二次失败是因为stateChangedformElement1,DISABLED,null。这就是我试图将这两个逻辑组合为一个逻辑的原因。Mockito保存并存储所有交互。每个验证都检查单个匹配交互。每个都是特定于默认times1行为的。如果他们失败了,那可能是因为匹配者不够具体。在本例之外,匿名内联匹配器不会总是返回true,是吗?