是否可以在Mockito中将某些返回值列入黑名单?

时间:2018-09-12 20:17:06

标签: java android mockito android-espresso

背景

我正在尝试使用Mockito在类中测试此方法:

该方法的第一种情况是当字符串等于常量时。

该方法的第二种情况是当字符串等于除了常量之外的其他任何内容。

这是关于anything except a certain integer的问题的字符串版本。

public class Class {
    private SomeOtherObjectWithAMethod someOtherObjectWithAMethod;

    public Class(SomeOtherObjectWithAMethod someOtherObjectWithAMethod){
        this.someOtherObjectWithAMethod = someOtherObjectWithAMethod;
    }

    public void method(){
        if(helperObject.obtainAString().equals(HelperObject.A_STRING_CONSTANT)){
            someOtherObjectWithAMethod.thisMethod("stringarg");
        }
        else{
            someOtherObjectWithAMethod.thisMethod("differentarg");
        }
    }

我知道在Mockito中可以

  1. 根据durron597

  2. 更改特定的返回值(但只有最后一个有效)
  3. null方法内输入thenReturn()作为不返回任何内容的方法。

  4. 使用anyString()作为虚拟字符串。
  5. 返回布尔值。

部分解决方案

我已经对第一种情况(str.equals("This string"))进行了单元测试,如下所示:

private Class instantiatedClass;

@Test
public void testMethod_thisString(){
    whenever(helperObject.obtainAString()).thenReturn(HelperObject.A_STRING_CONSTANT);
    instantiatedClass.method()
    verify(someOtherObjectWithAMethod).thisMethod("stringarg");
}

我将编写另一个类似的测试用例方法。我已经在下面注释了需要帮助的部分:

@Test
public void testMethod_notThisString(){
    whenever(helperObject.obtainAString()).thenReturn(/* A String that is not HelperObject.A_STRING_CONSTANT */);
    instantiatedClass.method()
    verify(someOtherObjectWithAMethod).thisMethod("differentarg");
}

问题

如何测试以外的任何字符串的特定值(或多个值)?

3 个答案:

答案 0 :(得分:0)

如果creating random strings不等于特定值,则可以使用它们。

答案 1 :(得分:0)

您可以执行Mockito.doAnswer( answer ),以更好地控制创建的String

类似这样:

List<String> blacklist = Arrays.asList("aaaa","bbbb");
Mockito.doAnswer((i)-> { 
    String x=RandomStringUtils.random(4);
    while(blacklist.contains(x)){
        x=RandomStringUtils.random(4);
    }
    return x;
}).when(helperObject).obtainAsString();

答案 2 :(得分:0)

虽然我不知道“除某些字符串外的任何字符串”的处理方式,但这解决了我的问题:

@Test
public void testMethod_notThisString(){
    whenever(helperObject.obtainAString()).thenReturn(HelperObject.CONSTANT1, HelperObject.CONSTANT2, HelperObject.CONSTANT3);
    instantiatedClass.method()
    verify(someOtherObjectWithAMethod).thisMethod("differentarg");
}

这遵循Overriding Stubbing的逻辑。