【问题标题】:How can I mock just for a non-null value?我怎样才能模拟一个非空值?
【发布时间】:2016-01-30 16:35:15
【问题描述】:

假设我正在测试以下方法。

/**
 * Does something. This method throws a {@code NullPointerException}
 * either given string or specified charset is {@code null}.
 * @param s the string
 * @param c the charset
 */
void doSomething(String s, Charset c) {
}

当我测试时,如何为非空目的制作模拟?

assertThrows(NullPointerException.class,
             new MyObject().doSomething(null, UTF_8));
assertThrows(NullPointerException.class,
             new MyObject().doSomething("", null));

是否有任何用于模拟一般非空值的库/方法?

我试过Mockito.mock,它似乎会为一些无效类型抛出异常,因为它实际上可以模拟。

更新

通过user2004685的回答,现在,我很好奇我是否可以像这样使用anyStringany(Class)

assertThrows(NullPointerException.class,
             new MyObject().doSomething(null, any(Charset.class)));
assertThrows(NullPointerException.class,
             new MyObject().doSomething(anyString(), null));

【问题讨论】:

    标签: java unit-testing mocking mockito


    【解决方案1】:

    这是一个void 方法。如果您使用 Mockito 模拟它以抛出异常,那么您需要执行以下操作:

     Mockito.doThrow(new NullPointerException("Description"))
         .when(mymock)
         .doSomething(Mockito.anyString(), Mockito.any(Charset.class));
    

    即使将null 传递给方法,它也应该可以工作。

    【讨论】:

    • 如果我将anyStringany(Charset.class) 用于""UTF_8 是否有意义?
    • 如果您希望 Mockito 处理输入的任何字符串的模拟,您可以使用 anyString()。如果您希望它用于选定的值,那么您可以查看Matchers 类并使用类似Matchers.eq("...") 的东西。此外,您可以使用Mockito.verify() 验证是否为给定值调用了模拟。
    猜你喜欢
    • 2015-04-22
    • 1970-01-01
    • 2011-01-31
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    相关资源
    最近更新 更多