坑突变-如果(x!= null)返回null否则抛出新的RuntimeException

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该突变

dre*_*our 5

我无法重现这个问题(即正确地杀死了相同的突变)。我认为您的问题没有包含足够的上下文(其他“pitest 没有用”所以问题似乎围绕使用 Spring 和/或 Mockito,这两者也修改了字节码/制作附加类)

https://stackoverflow.com/help/minimal-reproducible-example

  • 摇篮 5.2.1
  • JUnit 5
  • 皮特 1.4.5
    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)


srp*_*srp 4

它是 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)