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

使用构造函数参数模拟嵌套类并测试方法

郭乐湛
2023-03-14

我试图模拟一个有嵌套类的类。那个嵌套类有一个构造函数参数。当我试图使用mockito而不是mockito测试时,实际的方法正在执行。

我在外部类上做了@injectmock,在内部类上做了@Mock。

//Actual Class to test using Mockito.

public class ClassA {

public void initMethod(String s1, String s2, String s3, String s4) throws Exception {

    ClassB objB = null;
    if (objB == null && s3 != null && s4 != null && s2 != null) {

        SampleUtil.KeyStorePasswordPair pair = SampleUtil.getKeyStorePasswordPair(s3, s4);


        objB = new ClassB(s1, s2, pair.keyStore, pair.keyPassword);

        try {
            objB.meth1();  //Note: meth1 and meth2 are void methods.  
            objB.meth2();  // These two methods only to be accessed. something like doNothing

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
}

我像往常一样尝试使用@Mock调用类,但是实际的方法eth1()正在被访问。

//Somthing which I tried 
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {


@InjectMocks
ClassA classA;

@Mock
ClassB classB;

@Before
public void initMocks() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void testInitClient() throws Exception {
    // Setup

    // Run the test
    classA.initMethod("Lorem", "Ipsum", "TestStr1", "TestStr2");

    doNothing().when(classB).meth1(); // This is the line need to be mocked. But instead calling the actual method and executing
    // Verify the results
} 

需要模拟内部ClassB方法,而不是访问真实方法。

作为mockito的初学者,我试图澄清这一点。但在访问void方法等几点上感到困惑,所以无法使用。使用参数等访问构造函数。,

共有1个答案

赵锐
2023-03-14

我认为如果没有某种依赖注入,这是不可能的。

在这里,我修改了你的代码,这样它就可以按照你想要的方式运行。

public class ClassA {
    // Needed so that it can be replaced with setter
    private ClassB objB;

    // Extract the generation of ClassB so that it can be prevented
    public void generateClassB(String s1, String s2) {
        this.objB = new ClassB(s1, s2);
    }

    public void initMethod(String s1, String s2, String s3, String s4) {

        objB = null;
        if (s3 != null && s4 != null && s2 != null) {

            SampleUtil.KeyStorePasswordPair pair = SampleUtil.getKeyStorePasswordPair(s3, s4);

            generateClassB(s1, s2);

            try {
                objB.meth1();  //Note: meth1 and meth2 are void methods.
                objB.meth2();  // These two methods only to be accessed. something like doNothing

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void setClassB(ClassB classB) {
        this.objB = classB;
    }
}

这是我用来测试结果的ClassB的实现。

public class ClassB {
    private String s1;
    private String s2;

    public ClassB(String s1, String s2) {
        this.s1 = s1;
        this.s2 = s2;
    }

    public void meth1() {
        System.out.println(s1);
    }

    public void meth2() {
        System.out.println(s2);
    }
}

还有测试文件

@RunWith(MockitoJUnitRunner.class)
public class DemoApplicationTests {
    private ClassA classA;
    private ClassB classB;

    @Test
    public void testInitClient() {
        classA = Mockito.spy(ClassA.class);
        classB = Mockito.spy(new ClassB("a", "b"));

        Mockito.doNothing()
                .when(classB)
                .meth1();

        // This will replace the ClassA#generateClassB method call with the setter
        Mockito.doAnswer(args -> {
            classA.setClassB(classB);
            return null;
        }).when(classA).generateClassB(Mockito.any(), Mockito.any());
        classA.initMethod("a", "b", "c", "d");
    }
}

另一种更干净的解决方案是将ClassB实例传递给ClassA#initMethod。

 类似资料:
  • 问题内容: 我的课如下: 在构造函数中的逻辑和是我试图嘲弄的事情。我想要任何调用:返回一个虚拟字符串。 我试过了: 但这似乎不起作用。仍在执行构造函数逻辑,而不是获取的模拟对象。 问题答案: 您发布的代码适用于最新版本的Mockito和Powermockito。也许您还没有准备A?试试这个: A.java MockA.java 两项测试均应通过Mockito 1.9.0,powermockito

  • 考虑下面给出的代码: 我正在尝试编写一个单元测试用例: < li >调用< code >对象b。B()必须被嘲笑 < li >必须模拟对构造函数的调用 这就是我使用Mockito和Powermockito所做的: 第一个模拟成功工作,但第二个模拟使用 失败,并出现以下错误: org.powermock.reflect.exceptions.ConstructorNotFoundException:

  • 嗨,我有一个问题。我想用espresso为Ui编写android测试,为了让测试不是乱七八糟的,我想嘲弄一下我的演示者。 我在应用程序里用匕首。我的配置如下: 我有组件的模块 那么我也有一个用于活动的组件和一个用于组件的模块 那么我的页面就有了子组件 和子组件的模块 然后详细信息activity注入DetailPresenter 然后是使用构造函数注入的presenter 现在在测试中,我要做的是

  • 我正在为我的java类编写测试类。我将Junit5与Mockito一起使用。 我使用的Junit5与Power Mockito不兼容,所以我只使用Mockito。 我有,它具有下面这样的函数,并且在构造函数中初始化了。 当我编写测试用例时,我模拟了,但是由于我们在一个方法中创建,我如何模拟,这样我就可以编写期望值,根据我在测试类中设置的选择获得值?

  • 我有以下课程布局: 我正在为服务创建一个单元测试,但我想将ServiceHelper用作一个“活动”类,但要模拟ServiceHelper中的构造函数参数。有没有办法通过Mockito实现这一点?

  • 我是莫基托的新手。假设我有一节这样的课 我正在使用Mockito编写一个JUnit测试,我正在使用构造函数创建类的对象。当我安装类时,是否可以模拟Drew()方法?