【问题标题】:Mocking a method inside a private method在私有方法中模拟方法
【发布时间】:2021-11-28 07:00:42
【问题描述】:

我有以下流程

@InjectMocks private ClassToTest classToTest;

@Mock private ClassToInject classToInject;

@Before
public void setup() {
initMocks(this);
}

@Test
public void test() {
Classx mockClassObj = Mockito.mock(Classx.class);
when(classToInject.publicMethod1(mockClassObj)).thenReturn(1000);

classToTest.publicMethod();
}

我想测试 classToTest 的公共方法。现在这个方法调用了一个私有方法,我不是在嘲笑它。在这个私有方法中调用了另一个公共方法,我想模​​拟publicMethod1。而不是使用值 1000 的私有方法,它的行为就好像 publicMethod1 没有被模拟,我在某处的方法流中得到了 NPE。我尝试将@Spy 与classToTest 一起使用,并且我正在使用 init.mocks/@RunWith 但它失败了。

简而言之就是这样

ClassToTest。 publicMethod --> ClassToTest.privateMethod(不是模拟) --> ClassToInject.publicMethod1(想模拟)

类如下所示

class ClassToTest {
@Inject ClassToInject classToInject;

public publicMethod() {
privateMethod();
}

private privateMethod() {
int x = classToInject.publicMethod1();
// use the return value
// throw exception
}

【问题讨论】:

  • 你能把你正在测试的类的代码吗?
  • 添加了骨架
  • 顺便说一句,与您的 NPE 无关,但 ..classToInject.publicMethod1(mockClassObj) 是无用的,因为 mockClassObj 是在测试中创建的。 SUT 中使用的Classx 的任何值/实例都不会匹配,因此它不会返回 1000。
  • 检查模拟注入是否成功 - 打印 classToInject 并查看它是来自 Mockito 还是为空(或在 IDE 中放置断点并检查其 toString)。
  • 测试代码与实际代码(方法契约)存在一定差异。要隔离问题,请测试我上面建议的内容。如果结果为 null,则意味着某些东西正在封装 InjectMocks 注入模拟实例,而 Mockito 不会报告任何错误。

标签: java unit-testing mockito


【解决方案1】:

你模拟 classToInject.publicMethod1(mockClassObj) 而不是 classToInject.publicMethod1()。 但是您的代码调用了 classToInject.publicMethod1();

int x = classToInject.publicMethod1(); // you invoked no parameter method

检查您要调用的方法。

如果您想调用 classToInject.publicMethod1(),请参考此代码

@RunWith(MockitoJUnitRunner.class)
public class MockedTest {

    @InjectMocks
    private ClassToTest classToTest;
    
    @Mock
    private ClassToInject classToInject;
    
    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }
    
    @Test
    public void test() {
        Mockito.when(classToInject.publicMethod1())
                .thenReturn(1000);
        
        classToTest.publicMethod();
    }
    
    
}

class ClassToTest{
    ClassToInject classToInject;
    
    public void publicMethod() {
        privateMethod();
    }
    
    private int privateMethod() {
        int x = classToInject.publicMethod1();
        throw new NullPointerException(String.valueOf(x));
    }
}

class ClassToInject{
    
    public int publicMethod1() {
        return 0;
    }
}

结果是1000成功

java.lang.NullPointerException: 1000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2017-03-15
    • 1970-01-01
    • 2014-10-15
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多