我正在编写一个JUnit测试,我想在main方法中使用模拟对象。 主要方法使用了很多功能。有没有办法存根main方法中使用的一个函数?
更好的例子:
我是否可以将pet.func()中的返回值存根,以防对象是Mockito的鸟?
答案 0 :(得分:1)
第一个问题fpr的主要方法:有多少是很多?为了提高代码质量和可测试性,建议将大块切成小块。
对于您的问题:是的,也可以通过多种方法存取正在访问的单个方法。 但这是不好的做法。
在您的示例中,object2
不应该嘲笑object1
。原因是当您要测试main
是否正常工作时,您必须独立于object1
中的错误(如果object1
有错误,那并不意味着main
是错的)。差异不大,但影响巨大。因此,考虑编写两个测试:
Main
:mock away object1.function1()
Object1.function1()
:mock away object2.function2()
请检查this guide。我和Mockito有很好的经历。
更新到您的更新:
你要求条件嘲弄。这高度警告我,因为这会使您的测试有些不可靠。如果你这样做,有时你的测试将使用模拟对象,有时则不是。因此,您的测试取决于某些情况,这些情况也会使您的代码无法维护。请不要。
最好这样做:考虑一下你的软件和测试设计。如果宠物是动物的界面,所有动物必须包括界面的定义,并且行为有点类似。
一个例子:
public interface Pet {
public String name() {};
}
public class Dog implements Pet {
public String name() {
return "Sam";
}
}
public class Cat implements Pet {
public String name() {
return "Emma";
}
}
如果你研究一下这个例子的概念:
你可以测试那些东西。首先执行此操作,然后开发一些可测试性。但是,通过这个例子你可以问:如果我给我的大象一个姓氏怎么办? 然后对所有宠物实现进行测试以检查一个名称是无效的。现在,您要么使用接口继承,要么为每只动物编写特定的测试。而且,如果不使用您可能在一年内忘记的条件模拟,那么您的代码将非常可测试。
请记住编码,好像维护代码库的人是知道你住在哪里的连环杀手。书清洁代码非常好:))