java - Elasticsearch 集成测试和 spring-test 不能很好地协同工作 - AccessControlException
问题描述
看起来我们不能让 Junit 测试运行多个运行器。就我而言,我需要 RandomizedRunner(能够使用/扩展 ESIntegTestCases)和 SpringJUnit4ClassRunner 来自动装配被测类。
因为我们可以指定单个 @RunWith 注释。我保留了@RunWith(RandomizedRunner.class)。要激活 spring junit 测试支持,请在我的测试用例中添加以下内容。
@ClassRule
public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();
@Rule
public final SpringMethodRule springMethodRule = new SpringMethodRule();
但是,当我尝试使用上述设置运行单元测试时,我遇到了 AccessControlException。
Caused by: java.security.AccessControlException: access denied ("java.lang.reflect.ReflectPermission" "suppressAccessChecks")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:128)
at org.springframework.util.ReflectionUtils.makeAccessible(ReflectionUtils.java:207)
at org.springframework.util.ReflectionUtils.accessibleConstructor(ReflectionUtils.java:191)
at org.springframework.core.io.support.SpringFactoriesLoader.instantiateFactory(SpringFactoriesLoader.java:164)
... 17 more
完整的测试用例源码供参考:
import com.carrotsearch.randomizedtesting.RandomizedRunner;
import com.carrotsearch.randomizedtesting.annotations.ThreadLeakScope;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.rules.SpringClassRule;
import org.springframework.test.context.junit4.rules.SpringMethodRule;
@RunWith(RandomizedRunner.class)
@ThreadLeakScope(ThreadLeakScope.Scope.NONE)
@SpringBootTest(classes = ProductSearchDemoApplication.class)
public class ProductSearchServiceTest extends ESIntegTestCase {
@Autowired
private ProductService productService;
@ClassRule
public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();
@Rule
public final SpringMethodRule springMethodRule = new SpringMethodRule();
@Test
public void test() throws Exception {
System.out.println("SubTestWithRunner test()");
}
}
如果有人可以指导如何确保 spring-test 和 ESIntegTestCase 无缝协作,那就太好了。
解决方案
我知道这有点晚了,但我们刚刚遇到了很多问题ESIntegTestCase
并想分享我们的解决方案。我们最终使用来自testcontainers.org的Elasticsearch 容器作为我们集成测试的嵌入式 Elasticsearch。
优点是您可以使用任何版本的 Elasticsearch,并且很容易集成到任何项目中。
推荐阅读
- java - log4j 重新部署后不登录
- java - “线程“主”java.lang.NoSuchFieldError 中的异常:”
- flutter - ValueListenableBuilder 不重建小部件
- php - PHP - 在某些情况下无法删除文件夹
- python - 我用 OpenCV 进行氡变换有什么问题
- c++ - 在 macOS 中使用 omp.h 的正确方法
- macos - 如何在 macOS Big Sur 上安装 valgrind?
- unity3d - unity:加载一组资源
- python-3.x - 在 Python 中创建嵌套字典
- javascript - Swiper Slider 3d Cube Slide 不工作?