如何使用 Mockito 和 TestNG 模拟在方法内创建的对象[重复]

问题描述 投票:0回答:1

我正在尝试为 MyClass 中的方法编写单元测试,该方法创建 DependentClass 的实例并调用其方法 dependentMethod。在我的测试中,我想重写 dependentMethod 的行为,以便它返回 false 而不是 true。

这是 MyClass 和 DependentClass 的代码:

public class MyClass {
    public boolean myMethod() {
        DependentClass dependentObject = new DependentClass();
        return dependentObject.dependentMethod();
    }
}

class DependentClass {
    public boolean dependentMethod() {
        // Original behavior
        return true;
    }
}

这是我尝试使用 Mockito 和 TestNG 的测试代码:

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class MyClassTest {

    @Mock
    private DependentClass dependentClassMock;

    @InjectMocks
    private MyClass myClass;

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

    @Test
    public void testMyMethod() {
        // Arrange
        Mockito.when(dependentClassMock.dependentMethod()).thenReturn(false);

        // Act
        boolean result = myClass.myMethod();

        // Assert
        Assert.assertFalse(result);
    }
}

但是,这并不能按预期工作,因为 dependentMethod 在测试过程中仍然返回 true。我怀疑这是因为 myMethod 中创建的 DependentClass 实例不是模拟实例。

如何正确模拟 DependentClass,以便 dependentMethod 在 myMethod 中调用时返回 false?有没有一种方法可以在不显着重构 MyClass 的情况下实现这一目标?

预先感谢您的帮助!

java unit-testing mocking mockito testng
1个回答
0
投票

感谢发布此链接的人: Junit 本地对象模拟

这就是我根据那篇文章更改测试类的方法:

import org.mockito.*;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import static org.mockito.Mockito.mockConstruction;
import static org.testng.AssertJUnit.*;

public class MyClassTest {
    @Mock
    private MyClass myClass;

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

    @Test
    public void testMyMethod() {
        MyClass myClassTest = new MyClass();
        assertTrue(myClassTest.myMethod());
        System.out.println("Original behaviour: " + myClassTest.myMethod());

        try (MockedConstruction<DependentClass> dependentClassMockedConstruction = mockConstruction(DependentClass.class,
                (mock, context) -> {
                    Mockito.when(mock.dependentMethod()).thenReturn(false);
                })){
            MyClass myClass = new MyClass();
            System.out.println("Inside of try block: " + myClass.myMethod());
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.