我正在为公共方法创建一个使用JUnit的测试用例。这个方法调用同一个类中的一个私有方法,这个私有方法最终调用单独类中其他方法的序列,就像业务逻辑一样。所有方法都返回一个并发HashMap,我只想测试返回值上的assertNotNull
。
我如何避免方法调用的级联?
如果我去嘲笑流的所有方法,那么我的测试案例就会变得巨大。我怎样才能避免这些调用,只对我的方法执行黑盒测试,即传递参数和理论收益。
我的方法是:
public ConcurrentHashMap<String, Object> checkValidation(Validation validationData,
ConcurrentHashMap<String, Object> srcHMData, Statement statement) {
Column[] columnArray = validationData.getColumnArray();
ConcurrentHashMap<String, Object> processedData = new ConcurrentHashMap<String, Object>();
ConcurrentHashMap<String, Object> validationData = null;
if (columnArray != null && columnArray.length > 0) {
for (int i = 0; i < columnArray.length; i++) {
validationData = new ConcurrentHashMap<String, Object>();
Column colVal = columnArray[i];
String validationName = colVal.getName();
validationData = processValidation(validationName, srcHMData, statement);
processedData.putAll(validationData);
}
}
return processedData;
}
它从此类调用的私有方法是:
private ConcurrentHashMap<String, Object> processValidation(String validationName,
ConcurrentHashMap<String, Object> srcHMData, Statement statement) {
ConcurrentHashMap<String, Object> validationData = new ConcurrentHashMap<String, Object>();
try {
TransformationProcess transferObj = new TransformationProcess();
validationData = transferObj.checkTransformation(srcHMData, statement);
} catch (Exception e1) {
e1.printStackTrace();
}
return validationData;
}
我的测试方法我尝试过的东西:
TransformationProcess transMock = mock(TransformationProcess.class);
when(transMock.checkTransformationRule(Mockito.any(), eq(dummyDataMap), eq(mockStatement))).thenReturn(validationDataMap);
我想避免内部方法调用,从这一行在私人方法-
validationData = transferObj.checkTransformation(srcHMData, statement);
只想从这一行返回一个模拟ConcurrentHashMap,我可以测试它。但是,当这一行遇到问题时,它调用了整个业务流,最终得到了NullPointer异常。
您不能使用mockito模拟new
的调用。这里有两个选项:第一个选项是选择powermock
,它可以做比mockito多得多的事情,但只推荐用于遗留代码;第二个选项是重构代码,以便将对TransformationProcess
的依赖关系注入到验证器中。
您可以直接将
转换过程
注入您的方法:
public ConcurrentHashMap<String, Object> checkValidation(Validation validationData,
ConcurrentHashMap<String, Object> srcHMData, Statement statement, TransformationProcess transformationProcess)
这种方式看起来并不优雅,因为您必须将这种依赖关系传递给需要它的每个私有方法。
或者可以通过构造函数注入依赖项:
Validator(TransformationProcess transformationProcess)
现在,您不必每次都创建新实例,而是可以重用对象中已有的同一实例。如果您每次都需要
TransformationProcess
的新实例,您可以在构造函数中插入TransformationProcess
的包装器,该包装器将与新实例一起提供:
Validator(TransformationProcessProvider transformationProcessProvider)
...
TransformationProcess transformationProcess = transformationProcessProvider.getTransformationProcess();
现在,您可以创建
TransformationProcessProvider
的模拟,并将其传递给测试对象:
TransformationProcessProvider providerMock = mock(TransformationProcessProvider.class);
TransformationProcess transMock = mock(TransformationProcess.class);
when(providerMock.getTransformationProcess()).thenReturn(transMock);
when(transMock.checkTransformationRule(Mockito.any(), eq(dummyDataMap), eq(mockStatement))).thenReturn(validationDataMap);
Validator validatorUnderTest = new Validator(providerMock);
我有以下场景。 一个类,其中我有一个API,其内容如下: 这里我们有一个MyOtherClass,它包含一个执行某些操作的API decodeAndGetName()。它在另一个包中,我无法修改它的代码。 要求 我需要为上面的编写一个jUnit测试。现在我想以某种方式模拟的对象并模拟的返回值。 我无法做到这一点,因为我们有一个新的MyOtherClass(),一旦流到达这一行,它就会创建一个新实例
问题内容: 这是该结构及其方法的示例代码 然后我想从驻留在包外部的函数中调用方法,示例代码 我想通过模拟A 的方法来编写该功能的测试用例。 在Java中,我们有mockito,jmock框架来存根方法调用。 有什么办法,我们可以在不引入源代码的情况下模拟struct的方法调用吗? 问题答案: 要模拟方法调用,您需要模拟您的结构。 对于您提供的代码示例,我建议创建一个实现您的调用的接口。您的实际结构
我一直认为Mockito工作某种代理之类的东西。但现在我发现,Mockito允许我做一些像 这不适用于代理。它是如何做到这一点的?这种技术可以用来调用内部AOP方法吗?(请参见Spring AOP不适用于另一个方法中的方法调用)
如何为写在服务或控制器类中的方法中的日志语句编写JUnit测试用例。
问题内容: 我有一个要测试的类。只要有可能,我都会对该类进行依赖注入,该注入依赖于其他类的对象。但是,我遇到了一种情况,我想在不重新构造代码的情况下模拟对象,而不是应用DI。 这是要测试的课程: 我为此的测试课程是: 我想不出一种解决方案来模拟Dealer类中的打印对象。自从我在Test类中对其进行了模拟,但是它是在被测试的方法中创建的。我做了研究,但找不到任何好处。资源。 我知道从该方法中创建P
问题内容: 我在JUnit中有许多测试用例。它们都需要相同的代码才能在其静态方法中执行。这是代码重复,我正在努力摆脱它。这样做是一种肮脏的方式。JUnit中是否还有其他机制可能会有所帮助? PS。我写了关于这个主题的博客文章:http : //www.yegor256.com/2015/05/25/unit-test- scaffolding.html 问题答案: 规则是构成可重用代码(而不是从其