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

时间:2019-03-11 14:47:46

标签: java unit-testing mutation-testing pitest

我有一个返回自定义对象的方法

public MyObject getTheObject(){
  ...
  return muObject;
}

其单元测试检查getTheObject()方法返回的对象是否不为空

@Test
public void testGetTheObject(){
  ...
  assertNotNull(actualObject);
}

并通过测试。

运行突变测试with Pitest时,它显示一个SURVIVED突变,它表示如下:

mutated returned of Object for value for ..../getTheObject to ( if ( x!= null ) null else throw new RuntimeException )

问题是我们的单元测试应该如何摆脱这个问题,并KILL进行突变

2 个答案:

答案 0 :(得分:4)

我无法重现此问题(即,正确突变了相同的突变)。我认为您的问题没有包含足够的上下文(其他“ pitest无效”,所以问题似乎围绕使用Spring和/或Mockito进行,它们都还修改了字节码/制作了其他类)

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

  • 5.2.1级
  • JUnit 5
  • Pitest 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);
      }
    }

答案 1 :(得分:1)

它是PIT的“返回值变量”(当返回类型为Object时),并且如果未更改的方法将返回null,则它将用null替换非null返回值并抛出java.lang.RuntimeException。 >

即变异代码:

public MyObject getTheObject(){ ... return null; }

现在,如果此方法返回null,并且您尝试访问MyObject的任何方法,该怎么办。 在这种情况下,您将获得空指针异常(运行时异常),并且此assertNotNull()检查不会覆盖此用例。

因此,要杀死此mutator,我们可以检查任何属性的值。

回答:

assertThat(mutationTestService.getClassAObj(10).getA(),is(10));

getA()ClassA{int a}的获取者,我正在尝试检查是否获得与传递给构造函数进行初始化的值相同的值。