如何在测试类中的main中存根函数(java)

时间:2015-08-17 07:35:54

标签: java unit-testing mocking mockito powermock

我正在编写一个JUnit测试,我想在main方法中使用模拟对象。 主要方法使用了很多功能。有没有办法存根main方法中使用的一个函数?

更好的例子:

  • 主要致电宠物管理课程
  • 管理使用了基于动物的功能: pet.func()其中pet是与猫狗和鸟实现它的接口。 我想将bird.func与例如返回true存根。 但我想测试整个程序(public static void main),我假设bird.func()返回true(稍后在我的程序中说我是否(bird.func())做某事 - 所以我想要发生的事情(好像它是一个真正的真正价值)。

我是否可以将pet.func()中的返回值存根,以防对象是Mockito的鸟?

1 个答案:

答案 0 :(得分:1)

第一个问题fpr的主要方法:有多少是很多?为了提高代码质量和可测试性,建议将大块切成小块。

对于您的问题:是的,也可以通过多种方法存取正在访问的单个方法。 这是不好的做法。

在您的示例中,object2不应该嘲笑object1。原因是当您要测试main是否正常工作时,您必须独立于object1中的错误(如果object1有错误,那并不意味着main是错的)。差异不大,但影响巨大。因此,考虑编写两个测试:

  1. Main:mock away object1.function1()
  2. Object1.function1():mock away object2.function2()
  3. 请检查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";
      }
    }
    

    如果你研究一下这个例子的概念:

    • name始终返回String
    • name始终返回一个单词(无空格)
    • 名称始终是公共方法
    • 特定动物包括界面Pet

    你可以测试那些东西。首先执行此操作,然后开发一些可测试性。但是,通过这个例子你可以问:如果我给我的大象一个姓氏怎么办? 然后对所有宠物实现进行测试以检查一个名称是无效的。现在,您要么使用接口继承,要么为每只动物编写特定的测试。而且,如果不使用您可能在一年内忘记的条件模拟,那么您的代码将非常可测试。

    请记住编码,好像维护代码库的人是知道你住在哪里的连环杀手。书清洁代码非常好:))