我的代码:
C类:
public class C{
public int methodC(){
return 1000;
}
}
B类:
public class B{
private static C c;
public static int methodB(){
int b = c.methodC();
return b;
}
}
A类:
public class A {
public int methodA(){
int a = B.methodB();
return a;
}
}
TestA类:
class TestA{
@InjectMocks
A a;
@Mock
C c;
public void testMethodA(){
when(c.methodC()).thenReturn(5);
int result = a.methodA();
assertEquals(result, 5);
}
}
即使我嘲笑c.methodC()
,methodC
中的methodB
调用也会返回null
。
如何模拟methodC
通话?
我无法更改源代码,只能在TestA
类中进行更改
另外,我也不能使用PowerMockito
。
答案 0 :(得分:3)
这是一种使用您的约束使其工作的方法:
A a = new A();
C c = Mockito.mock(C.class);
@Test
public void testMethodA(){
try {
Field c = B.class.getDeclaredField("c");
c.setAccessible(true);
c.set(null, this.c);
} catch (Exception e) {
e.printStackTrace();
}
Mockito.when(c.methodC()).thenReturn(5);
int result = a.methodA();
assertEquals(result, 5);
}
答案 1 :(得分:2)
@Nikhil根据您对所提问题的更新,完善了我的答案。
使用Mockito不能进行静态模拟,并且如您所述,您不能使用PowerMock,那么@Jnorman的答案就很好。使用Spring Boot和Mockito来实现此目的,您需要修改Spring Boot Starter的测试依赖项,以添加新版本的Mockito,因为Mockito 3.4.0支持静态模拟。
Mockito GitHub链接
https://github.com/mockito/mockito/issues/1013
修改后的POM
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>3.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>3.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.4.0</version>
<scope>test</scope>
</dependency>
修改后的代码
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.withSettings;
import java.lang.reflect.Method;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.invocation.Invocation;
import org.mockito.invocation.InvocationFactory;
import org.mockito.invocation.MockHandler;
public class TestA {
@Test
public void testMethodA() {
A a = new A();
mockStatic(B.class);
when(B.methodB()).thenReturn(5);
int result = a.methodA();
assertEquals(result, 5);
}
}
class A {
public int methodA() {
int a = B.methodB();
return a;
}
}
class B {
private static C c;
public static int methodB() {
int b = c.methodC();
return b;
}
}
class C {
public int methodC() {
return 1000;
}
}
答案 2 :(得分:0)
Mockito [3.4.0] can mock static methods!
firebase deploy
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>3.4.0</version>
<scope>test</scope>
</dependency>