当有两个公共方法并且一个方法调用同一个类中的另一个公共方法时,测试方法的方法是什么?
在这种情况下,我应该如何编写单元测试?
一个例子
class SpecificIntMath {
public int add(int a,int b) {
return a+b;
}
public int multiply(int a, int b) {
int mul = 0;
for(int i = 0;i<b,i++) {
mul=add(a,mul);
}
return mul;
}
}
这个例子并没有显示所涉及的方法的复杂性,而是概念的复杂性。
我应该分别测试加法和乘法吗?如果我只测试乘法,我觉得我们错过了不能提供参数的情况。
假设要分别测试乘法
和加法
,我应该能够模拟加法
?这怎么可能?
假设要分别测试乘法和加法,我不应该模拟,我应该让加法按原样执行吗。如果是这种情况,我应该如何处理添加中的程序流?
测试这种情况的方法是什么。
编辑1:
在下面的代码中,
class MCVC {
public boolean getWhereFrom(List<User> users) {
boolean allDone = true;
for(User user: users){
String url = user.getUrl();
switch(url) {
case Consts.GOOGLE:
someDao.updateFromAddr(user);
user.setEntry("Search Engine");
break;
case Consts.FACEBOOK:
someDao.updateFromAddr(user);
user.setEntry("Social Media");
break;
case Consts.HOME:
someDao.updateToAddr(user);
user.setEntry("Company");
default
user.setEntry(null);
allDone = false;
break;
}
}
return allDone;
}
public void likedDeck() {
List<Users> usersList = deckDao.getPotentialUsers(345L,HttpStatus.OK);
boolean flag = getWhereFrom(usersList);
if(flag) {
for(User user: usersList) {
//some Action
}
}
}
}
在测试likedDeck()时,我应该考虑getWhereFrom()
,还是应该假设任何默认情况?如果我考虑默认情况,我会在输出不是默认的情况下失败。我不确定我是否应该嘲笑它,因为调用的类正在测试中。测试中的间谍/模拟类
我应该分别测试加法和乘法吗?
如果您正在进行单元测试,那么应该单独测试它们。您只希望在进行组件或集成测试时一起测试它们。
假设乘法和加法要单独测试,我应该能够模拟加法吗?
是呀
这怎么可能?
使用mockito或任何其他模拟框架。您可以在此处看到的确切方式使用Mockito模拟某些方法但不模拟其他方法
假设乘法和加法分别测试,我不应该模拟,我应该让加法按原样执行吗。
我不会那样做。add中的内部更改可能会影响乘法测试,您的测试会变得更加复杂和不稳定。
至少要分别测试它们。乘法测试隐式测试加法没有问题。在大多数情况下,你应该问自己这两种方法是否都需要公开。
你不关心。
您可以使用单元测试单独测试每个公共方法的契约。因此,您编写的测试可以确保add()
和multiply()
都完成了它们应该做的事情。
一方在内部使用另一方的事实在外部没有任何意义。您的测试既不应该知道也不应该关心这个内部实现细节。
为了记录在案:因为你的代码是现在编写的;你绝对不能在这里转向嘲笑。这里不需要嘲笑;只会增加测试与你真正的生产代码无关的东西的风险。你只在必须控制对象的各个方面才能启用测试的情况下使用嘲笑。但是你的示例代码中没有任何东西需要模拟来测试。如果是的话——这将表明设计/实现不佳(考虑到这些方法的契约)!
编辑;给出问题中的更改示例:
首先,getWhat From()
中有一个错误-您迭代一个列表;但是您一直覆盖该列表中的返回值。因此,当第一次迭代将结果设置为false时;该信息可能会在下一个循环中丢失。
我认为实际问题有两种选择:
getWhereFrom()
可能值得它自己的类(在这里,我可能不会让它处理用户列表;但只有一个用户;这也有助于返回单个布尔值;-)。当您这样做时,您可以使用依赖注入来获取“WhereFromService”类的(模拟)实例
换句话说:你正在展示的代码可以被修改/重构;例如,更清楚地遵循SRP。但这当然是一项更大的事业;你需要和周围的人讨论。
我需要一些软件测试方面的指导。 我把事情复杂化了,但我太专注了,看不到我做错了什么,也看不到其他做事方式。 我有几个公共方法使用相同的私有方法。 私有方法本身: 必须为其特定角色处理许多场景 假设私有方法需要5个测试来覆盖所有场景,并由6个公共方法使用。 问题 > 然后我是否需要至少5x6个测试? 如何对每个公共方法重复使用私有方法的测试? 有没有关于重构重复测试的示例/文章? 示例 OnStar
有一个应用程序需要像搜寻列表这样的东西。这个应用程序可以用不同的配置多次启动。有没有办法跨JVM共享数据结构。在JVM中是有效的。有一个数据库可以解决这个问题。但是,有没有更简单、更快速的方法?
嗨我正在努力解决我面临的问题 我想做的是调用test1类的zahl方法 这是我尝试过的,但它什么也没有返回,即使它应该显示我的错误。
在这里,我只想确保抛出异常测试,但希望跳过调用方法在其中。我试着跟着走,但没有奏效
问题内容: 我有一个直接依赖RestTemplate的类。我希望我可以离线进行JUnit测试。 如何在单元测试中模拟RestTemplate? 问题答案: 我建议重构您的客户端代码,以 消除 对的直接依赖,并用对的引用替换它,该引用是由实现的。和您应该编码的那个。 然后,您可以在代码中插入存根或模拟对象以进行单元测试,并在将其用于实际时注入。
我对b()有一套完整的测试,它完成了繁重的任务。不幸的是,我不得不做一个丑陋的想法,比如()(遗留代码),我不想复制所有的测试。方法b()的。此外,这两个都需要公开。 我想验证在某些情况下a()调用b(),但我不能这样做,beacause测试类不是mock。我需要一种方法来验证该方法是在真实对象上调用的,而不仅仅是在模拟对象上调用的。