gpt4 book ai didi

java - 如何从Spring服务访问私有(private)方法?

转载 作者:行者123 更新时间:2023-12-01 16:44:27 25 4
gpt4 key购买 nike

我有一个服务,其中包含用于数据库操作的公共(public)方法,并标记有 org.springframework.transaction.annotation.Transactional 注释。

我想通过 Java 反射访问私有(private)方法(没有事务注释):service.getClass().getDeclaredMethod('privateMethod', args)

当我调用它时,我获取java.lang.NoSuchMethodException。当我删除所有 @Transactional 注解的方法时,它起作用了。这种行为有什么原因吗?我该如何解决?

public class MyService {

@Transactional(readOnly = true)
public Integer publicMethodMarkedWithTransactional(int a, int b) {
//couple of database requests
return privateMethod(b, a);
}

private Integer privateMethod(int a, int b) {
return a + b;
}

}

public class MyServiceTest {

@Autowired
private MyService service;

@Test
public void test() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Method privateMethod = service.getClass().getDeclaredMethod("privateMethod", int.class, int.class);
privateMethod.setAccessible(true);
int res = (int) privateMethod.invoke(service, 5, 10);
assertEquals(5 + 10, res);
}

}

最佳答案

您可以导入ReflectionUtils :

import org.springframework.data.util.ReflectionUtils;

测试将如下所示:

@Test
public void test() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Method privateMethod = ReflectionUtils.findRequiredMethod(MyService.class, "privateMethod", int.class, int.class);
int res = (int) privateMethod.invoke(service, 5, 10);
assertEquals(5 + 10, res);
}

但是,我建议不要以这种方式编写测试 - 您应该找到一种方法来测试您的 API。私有(private)方法不是 API 的一部分,这种方式的测试会使您的测试变得更加脆弱。

关于java - 如何从Spring服务访问私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55224396/

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