[JUnit Unit测试用例]:java.lang.NoClassDefFoundError:org / apache / commons / logging / Log

时间:2016-09-30 08:47:25

标签: spring unit-testing junit mockito

在我模拟时获取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服务器解析。

2 个答案:

答案 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

但最终有很多组合可供选择,具体取决于您的偏好。