有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

更好的例子:

  • 梅因叫宠物管理课
  • 管理人员使用了基于动物的功能: 聚酯食品包装材料func(),其中pet是一个接口,由catdog和bird实现。 我想把这只鸟剪断。func,例如返回true。 但是我想测试整个程序(public static void main),我假设这只鸟。func()返回true(比如在我的程序后面,我会问(bird.func())是否做了什么事——所以我希望这件事发生(就像它是一个真正的真值一样)

我可以存根宠物的返回值吗。func()仅当对象是带有Mockito的鸟时


共 (1) 个答案

  1. # 1 楼答案

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

    对于您的问题:是的,可以对正在访问的单个方法进行存根,也可以通过多个方法进行存根<但是那是不好的做法

    在你的例子中,不应该嘲笑object2,而应该嘲笑object1。原因是,当您想测试main是否正常工作时,必须独立于object1中的错误(如果object1有错误,这并不意味着main是错误的)。差别很小,但影响很大。因此,考虑写两个测试:

    1. Main:模仿object1.function1()
    2. Object1.function1():模仿object2.function2()

    请检查this guide。我和莫基托相处得很好


    更新到您的更新:

    你是在要求有条件的嘲笑。这让我非常警觉,因为这让你的测试有些不可靠。如果您这样做,有时您的测试将使用模拟对象,有时则不会。因此,测试取决于某些情况,这些情况也会使代码无法维护。请不要

    最好这样做:想想你的软件和测试设计。如果pet是动物的界面,那么所有动物都必须包含该界面的定义,并且表现得有些相似

    举个例子:

    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总是返回一个字符串
    • name始终返回一个单词(无空格)
    • name始终是一个公共方法
    • 特定的动物包括宠物

    你可以测试这些东西。先这么做,你就会发展出一些可测试性。然而,在这个例子中,你可以问:如果我给我的大象起一个姓怎么办 然后,在所有pet实现上检查一个名称的测试无效。现在你要么使用接口继承,要么为每只动物编写一个特定的测试。同样地,你的代码是极好的可测试性,没有使用条件模拟,你可能会在一年内忘记

    记住编码,就好像维护你代码库的人是一个知道你住在哪里的连环杀手。这本书干净的代码非常好:)