在同一个类中模拟另一个公共方法是一个好习惯吗

例如:


public class NumberService {


public boolean isNaturalNumber(int num) {

    return num > 0;

}


public String getClassificationInfo(int num) {

    return isNaturalNumber(num) ? num + "is a natural number" : num + "is not a natural number";

}

}

这里有两个公共方法,以及getClassificationInfo称为方法的方法isNaturalNumber。


isNaturalNumber测试时模拟是一个好习惯getClassificationInfo吗?


像这样:


    @RunWith(MockitoJUnitRunner.class)

public class NumberServiceTest {


@Spy

private NumberService numberService;


@Test

public void test_getClassificationInfo_when_is_natural_number() {

    int num = generateInt();


    doReturn(true).when(numberService).isNaturalNumber(num);


    String classificationInfo = numberService.getClassificationInfo(num);


    assertThat(classificationInfo).isEqualTo(num + "is a natural number");

}


@Test

public void test_getClassificationInfo_when_is_not_natural_number() {

    int num = generateInt();


    doReturn(false).when(numberService).isNaturalNumber(num);


    String classificationInfo = numberService.getClassificationInfo(num);


    assertThat(classificationInfo).isEqualTo(num + "is not a natural number");

}


// the other test for isNaturalNumber


private int generateInt() {

    return new Random().nextInt();

}

}


ITMISS
浏览 162回答 2
2回答

冉冉说

在这种特殊情况下,模拟调用的方法是没有意义的。然而,这不仅仅是因为它是同一个类的方法。实际上,有时会专门引入同一类的方法以允许模拟它们。例如,如果在您的类中处理通过文件 I/O 获得的某些数据,您可以将文件 I/O 隔离到它自己的方法中。然后,您可以使用文件 I/O 方法的模拟版本测试数据处理。但是,在这种情况下,没有充分的理由isNaturalNumber在测试中模拟getClassificationInfo: 该方法isNaturalNumber具有确定性的行为,并且不会导致不可接受的长执行时间。这似乎也不太可能通过模拟的情况下获得太多isNaturalNumber在一个测试中错误地故意行为getClassificationInfo。你不必教条地嘲笑一切。例如,您也不要模拟标准库数学函数,如sin或cos,因为它们在大多数情况下也不会引起问题。模拟应该是有原因的。因此,如果您考虑模拟一个函数或方法,您应该知道您将要解决哪个问题。如果没有问题要解决,不要嘲笑。

阿波罗的战车

不,这不是一个好习惯,因为我们应该在涉及其他模块/类对象的地方模拟存根。例如:public class A{   private B aObj;   public void aDoingSomeBWork(){      aObj.someMethod();      someLogic();  }   private/public/any modifier void someLogic(){     //some logic   }}public class B{   public void someMethod(){}}那么你应该模拟 B 的 someMethod() 但不应该模拟 A 的 someLogic() 因为你正在单元测试 A 的 aDoingSomeBWork() 方法。如果你模拟 someLogic(); 在单元测试中,可能会出现您的代码中断的情况。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java