在helper类的静态方法中调用getMarkup()
时,它会抛出一个NPE。我所做的是嘲笑MarkupMaker和它的返回值(一个Markup实例)。最后,我希望调用标记实例的toString()
。无论我做什么-getMarkup()
的调用都是抛出一个NPE。我找不到任何文档告诉我如何在spock中详细模拟方法调用值。
编辑:我添加了示例。maker.getMarkup()
的调用返回null,即使我在spock测试中对其进行了嘲弄。
test.groovy
class TestExample extends Specification {
@Shared
MarkupMaker makerMock = Mock()
@Shared
MarkupObject markupMock = Mock()
def setup() {
markupMock.toString() >> "headline1"
makerMock.getMarkup() >> markupMock
}
@Unroll
def "Should return a Markupvalue #expectedvalue"(MarkupMaker helper, int tabElementIndex, String expectedValue) {
expect:
MarkupHelper.getMarkupForIndex(helper, tabElementIndex) == expectedValue
where:
helper | tabElementIndex | expectedValue
makerMock | 1 | "headline1"
}
}
java(执行模拟对象的方法)
public class MarkupHelper {
public static MarkupObject getMarkupForIndex(MarkupMaker maker, int index){
if(index == 1){
maker.getMarkup();
}
return null;
}
}
java(被嘲弄的对象之一)
public class MarkupMaker {
public MarkupObject getMarkup() {
return new MarkupObject();
}
}
markupObject.java(保存测试值的最后一个模拟对象)
public class MarkupObject {
@Override
public String toString() {
return "headline1";
}
}
在您提供的示例中,MarkupHelper将始终返回null。您只需调用maker.getMarkup()
而不对其执行任何操作。因此执行将继续,返回null
。
Leonard的答案是正确的,因为您使用了@shared
来获得模拟对象上的NPE,但是由于您的MarkupHelper实际上没有做您期望的事情,所以您的测试仍然不能满足。
类似地,您的MarkupObject mock正在拦截toString将无法工作,因为在您想要使用它的时候,它将在模拟之外,因此不会被使用。为了处理这个问题,您应该让您的MarkupHelper返回一个字符串,如下所示:
public static String getMarkupForIndex(MarkupMaker maker, int index){
if(index == 1){
return maker.getMarkup().toString();
}
return null;
}
如果您仍然希望您的MarkupHelper返回一个MarkupObject,那么在您的测试中,您将需要创建一个与实际的MarkupObject具有相同属性的预期MarkupObject。
删除模拟上的@shared
,因为模拟不支持它。
正在测试的类: 下面是测试代码。我模拟了测试中的类class,并覆盖了方法getFruits的返回值。但是当我运行mock时,我没有得到预期的mock返回值。Easymock可以将返回值替换为被测试类的方法,如果这些方法是显式模拟的。当我模拟真实的对象方法时,如何获得模拟的返回值。
我正在为类编写一个单元测试,该类如下所示: 我想编写一个简单的单元测试,它将方法存根(这样它就不会实际触发并命中数据库),但它允许我验证调用是否最终执行。Mockito似乎是这份工作的合适工具。 这似乎是一个很好的游戏计划(至少对我来说)。但当我实际编写代码时,在测试方法的第2行(行)出现以下编译器错误: 类型Mockito中的(T)不适用于参数(void)时的方法 我看到Mockito无法模拟返
是否可以用Spock模拟java中的静态方法?我知道模拟静态groovy方法是可能的,但无法使其适用于Java方法。
我遇到了一个挑战,当我单独运行测试时,测试通过了,但当我运行所有测试时,测试失败了,它会显示以下错误消息: java.lang.RuntimeException:Android.os.Looper中的方法getMainLooper未被嘲弄。详见http://g.co/androidstudio/not-mocked。 在Android.os.looper.GetMainLooper(looper.
我需要测试一些遗留代码,这些代码在a方法调用中使用了单例。测试的目的是确保类sunder测试对singletons方法进行调用。我在SO上看到过类似的问题,但所有的答案都需要其他依赖项(不同的测试框架)--不幸的是,我仅限于使用Mockito和JUnit,但对于这样流行的框架,这应该是完全可能的。 单身人士: 正在测试的类: 单元测试: 这个想法是配置可怕的单例的预期行为,因为被测试的类将调用它的