gpt4 book ai didi

java - Mockito - 如何忽略私有(private)成员对象的方法调用?

转载 作者:行者123 更新时间:2023-12-01 12:31:29 31 4
gpt4 key购买 nike

我想测试这个方法,但在该方法内部创建了一个新对象,然后调用该新对象的方法。我想跳过它(它涉及登录到我不感兴趣的 j2ee 服务器数据库)。作为一个简单的示例,我只想验证 param1.logic() 被调用一次,但测试最终失败,因为 obj 尝试使用我不想输入的凭据登录。私有(private) Object2 obj 变量没有 getter 或 setter,但有没有办法跳过构造函数和以下登录调用?

public class Object1{

private Object2 obj;

public void method(Object3 param1, String param2){
//functionality
//logic to be tested
param1.logic();
//end functionality

//how can I skip these two lines?
obj = new Object2(param1);
obj.logon(param2,param2,null, false);
}
}

这是我尝试使用的,但 obj.logon 内部的方法仍在被调用。

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Object2.class)
public class TestObject
{
@SuppressWarnings("unchecked")
@Before
public void init() throws Exception
{
var1 = mock(Object3.class)
obj2 = mock(Object2.class);
PowerMockito.whenNew(Object2.class).withAnyArguments().thenReturn(obj2);
}

@Test
public void testInvokeStandAloneJob() throws Exception
{
TestObject test = spy(new TestObject());
Mockito.doAnswer( new Answer<Object>(){
public Object answer(InvocationOnMock invocation){
Object[] args = invocation.getArguments();
return "called with arguments: " + args;
}
}).when(obj2).logon(Mockito.anyString(), Mockito.anyString(),Mockito.anyString(), Mockito.anyBoolean());
//also tried doNothing
//Mockito.doNothing().when(obj2).logon(sDomainName, username,null, false);

//call method
test.method(var1, var2);

verify(var1,times(1)).logic();
}

如何使这两行(构造函数和以下方法不执行任何操作?)

最佳答案

我相信您可以使用 powermock 来模拟对 new() 的调用,并返回一个在调用登录方法时不执行任何操作的模拟对象。

在使用 PowerMock 之前,请确保遵循本页上的说明:https://code.google.com/p/powermock/wiki/MockConstructor

具体:

确保将其添加到测试类的顶部

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassThatCreatesTheNewInstance.class)

Use PowerMock.createMock(NewInstanceClass.class) to create a mock object of the class that should be constructed (let's call it mockObject).

或者,您可以重新设计类,以不在该方法中使用 new 关键字。 (无论如何,这是不好的做法)

关于java - Mockito - 如何忽略私有(private)成员对象的方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25896663/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com