当前位置: 首页 > 知识库问答 >
问题:

如何避免在为特定方法执行Junit测试用例和模拟时调用内部方法结构的级联

步骏
2023-03-14

我正在为公共方法创建一个使用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异常。

共有1个答案

乐正晟
2023-03-14

您不能使用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 问题答案: 规则是构成可重用代码(而不是从其