在我模拟时获取java.lang.NoClassDefFoundError:org / apache / commons / logging / Log。参考代码
@Mock
private RestTemplate restTemplate;
我们包含的依赖
testCompile "org.apache.logging.log4j:log4j-slf4j-impl:2.5"
testCompile "org.apache.logging.log4j:log4j-core:2.5"
testCompile "org.slf4j:jcl-over-slf4j:1.7.21"
testCompile "commons-logging:commons-logging:1.1.1"
注意:我们正在使用slf4j日志记录。 对于实际应用程序,这些依赖项由tomcat服务器解析。
答案 0 :(得分:0)
首先要记住的是 - "你正在使用模拟对象"而mock只是一个占位符,它不是真正的对象。因此,您必须定义其行为和依赖关系。模板定义为mock,因此您必须注入任何依赖对象,如logger。你可以通过使用类似的东西来实现这个目标
@RunWith(MockitoJUnitRunner.class)
public class MyTest {
@Mock
Logger logger;
@InjectMocks
private RestTemplate restTemplate;
@Test
public void isLoggerGettingCalled() throws Exception {
// Your test logic
}
}
答案 1 :(得分:0)
我认为这是一种罕见的情况,你实际上并没有错过特定的类,但是其中有一对很多。如果您检查导入的这两个罐子:
testCompile "org.slf4j:jcl-over-slf4j:1.7.21"
testCompile "commons-logging:commons-logging:1.1.1"
你会看到,他们俩都有以下课程:
org/apache/commons/logging/Log
类加载器遇到了这种重复,无法加载类定义。如果您正在寻找slf4j罐子的正确组合,我会选择这两种方案中的任何一种:
slf4j-api-[latest-version].jar
slf4j-simple-[latest-version].jar
OR
slf4j-api-[latest-version].jar
slf4j-log4j12-[latest-version].jar
log4j-[latest-version].jar
但最终有很多组合可供选择,具体取决于您的偏好。