单元测试如何在测试类(java)中的main中存根函数
我正在编写一个JUnit测试,我希望在主方法中使用模拟对象。 主方法使用了很多函数。有没有办法存根main方法中使用的函数之一
更好的例子:
- 梅因叫宠物管理课
- 管理人员使用了基于动物的功能: 聚酯食品包装材料func(),其中pet是一个接口,由catdog和bird实现。 我想把这只鸟剪断。func,例如返回true。 但是我想测试整个程序(public static void main),我假设这只鸟。func()返回true(比如在我的程序后面,我会问(bird.func())是否做了什么事——所以我希望这件事发生(就像它是一个真正的真值一样)李>
我可以存根宠物的返回值吗。func()仅当对象是带有Mockito的鸟时
# 1 楼答案
第一个问题fpr的主要方法:多少是很多?为了提高代码质量和可测试性,建议将大块代码切成小块
对于您的问题:是的,可以对正在访问的单个方法进行存根,也可以通过多个方法进行存根<但是那是不好的做法
在你的例子中,不应该嘲笑
object2
,而应该嘲笑object1
。原因是,当您想测试main
是否正常工作时,必须独立于object1
中的错误(如果object1
有错误,这并不意味着main
是错误的)。差别很小,但影响很大。因此,考虑写两个测试:Main
:模仿object1.function1()
Object1.function1()
:模仿object2.function2()
请检查this guide。我和莫基托相处得很好
更新到您的更新:
你是在要求有条件的嘲笑。这让我非常警觉,因为这让你的测试有些不可靠。如果您这样做,有时您的测试将使用模拟对象,有时则不会。因此,测试取决于某些情况,这些情况也会使代码无法维护。请不要
最好这样做:想想你的软件和测试设计。如果pet是动物的界面,那么所有动物都必须包含该界面的定义,并且表现得有些相似
举个例子:
如果你研究一下这个例子的概念:
你可以测试这些东西。先这么做,你就会发展出一些可测试性。然而,在这个例子中,你可以问:如果我给我的大象起一个姓怎么办 然后,在所有pet实现上检查一个名称的测试无效。现在你要么使用接口继承,要么为每只动物编写一个特定的测试。同样地,你的代码是极好的可测试性,没有使用条件模拟,你可能会在一年内忘记
记住编码,就好像维护你代码库的人是一个知道你住在哪里的连环杀手。这本书干净的代码非常好:)