Tos*_*far 5 java unit-testing mutation-testing pitest
我有一个返回自定义对象的方法
public MyObject getTheObject(){
...
return muObject;
}
Run Code Online (Sandbox Code Playgroud)
其单元测试检查getTheObject()方法返回的对象是否不为null
@Test
public void testGetTheObject(){
...
assertNotNull(actualObject);
}
Run Code Online (Sandbox Code Playgroud)
并通过测试。
当使用Pitest进行突变测试时,它显示一个SURVIVED突变,它表示如下内容:
mutated returned of Object for value for ..../getTheObject to ( if ( x!= null ) null else throw new RuntimeException )
Run Code Online (Sandbox Code Playgroud)
问题是我们的单元测试应该如何摆脱这个问题,并且KILL该突变
我无法重现这个问题(即正确地杀死了相同的突变)。我认为您的问题没有包含足够的上下文(其他“pitest 没有用”所以问题似乎围绕使用 Spring 和/或 Mockito,这两者也修改了字节码/制作附加类)
https://stackoverflow.com/help/minimal-reproducible-example
public class SO55104467 {
public static class MyObject {}
private final MyObject muObject = new MyObject();
public MyObject getTheObject(){
return muObject;
}
}
class SO55104467Test {
private SO55104467 sut = new SO55104467();
@Test
public void testGetTheObject(){
SO55104467.MyObject actualObject = sut.getTheObject();
assertNotNull(actualObject);
}
}
Run Code Online (Sandbox Code Playgroud)
它是 PIT 的“返回值变异器”(当返回类型为 Object 时),它将用 null 替换非 null 返回值,如果未变异的方法返回 null,则抛出 java.lang.RuntimeException 。
即变异代码:
public MyObject getTheObject(){
...
return null;
}
Run Code Online (Sandbox Code Playgroud)
上述 mutator 预计您的 Junit 会失败,但由于运行时异常原因。
assertNotNull(getTheObject())只是检查返回对象是否为空,并且没有办法仅通过检查对象值来获取运行时异常。
要杀死这个修改器,您可以调用该对象的任何方法(例如 getter())。现在,如果您通过空对象(由上面的静音代码返回)调用任何方法,那么您将得到空指针异常(即Runtime exception),并且您的 Junit 将因静音代码而失败。
答:
assertThat(getTheObject().getterOfAnyField(),is(expectedValue));
Run Code Online (Sandbox Code Playgroud)
或者
assertNotNull(getTheObject().getterOfAnyField());
Run Code Online (Sandbox Code Playgroud)