gpt4 book ai didi

methods - 如何使用 PowerMockito 模拟私有(private)方法的任何参数?

转载 作者:行者123 更新时间:2023-12-02 17:21:09 25 4
gpt4 key购买 nike

我正在使用 Mockito 1.9.5、PowerMock 1.5.1、JUnit 4.11 和 Spring 3.1.4.RELEASE。我正在尝试编写一个 JUnit 测试,在其中我想模拟一个不执行任何操作的私有(private)方法。私有(private)方法签名是

public class MyService
{


private void myMethod(byte[] data, UserFile userFile, User user)
{

在我的 JUnit 测试中我有

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
@PrepareForTest(MyServiceImpl.class)
public class MyServiceIT
{

@Rule
public PowerMockRule rule = new PowerMockRule();

@Autowired
private MyService m_mySvc;
private MyService m_mySvcSpy;

@Before
public final void setup() throws Exception
{
m_mySvcSpy = PowerMockito.spy(m_mySvc);
PowerMockito.doNothing().when(m_mySvcSpy, “myMethod”, Matchers.any(byte[].class), Matchers.any(UserFile.class), Matchers.any(User.class));

不幸的是,第二行因异常而终止

testUploadFile(org.mainco.subco.user.service.MyServiceIT)  Time elapsed: 12.693 sec  <<< ERROR!

org.powermock.reflect.exceptions.MethodNotFoundException:在类 org.mainco.subco.user.service.UserFileService$$EnhancerByMockitoWithCGLIB$$4 中找不到名称为“myMethod”且参数类型为 [ null, null, null ] 的方法e52bc77。 在 org.powermock.reflect.internal.WhiteboxImpl.throwExceptionIfMethodWasNotFound(WhiteboxImpl.java:1247) 在 org.powermock.reflect.internal.WhiteboxImpl.findMethodOrThrowException(WhiteboxImpl.java:985) 在 org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:882) 在 org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:713) 在 org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:401) 在 org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:93) 在 org.mainco.subco.user.service.MyServiceIT.setup(UserFileServiceIT.java:42)

使用 PowerMockito 模拟私有(private)方法的泛型参数的正确方法是什么?

最佳答案

我还没有测试过它,但我相信找不到私有(private)方法的原因是它在 Spring 为 MyService 提供的对象中不存在界面。该对象是一个代理,它是生成的类的实例,它不扩展 MyServiceImpl ;所以,没有private myMethod(...)就在其中。

为了避免这个问题,测试不应该使用 Spring。相反,实例化 MyServiceImpl直接在 setup()方法。如果测试需要其他依赖项注入(inject)m_mySvc ,然后为它们创建模拟并让 PowerMock 注入(inject)它们。

关于methods - 如何使用 PowerMockito 模拟私有(private)方法的任何参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26041958/

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