如何模拟测试类之外的方法



我的代码:

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;
}
}

A类测试:

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()methodB中的methodC调用也返回null

如何模拟methodC调用?

我不能更改源代码,只能在TestA类中进行更改我也不能使用PowerMockito

以下是使用约束使其工作的方法:

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);       
}

@Nikhil基于您对所问问题的更新,完善我的答案。

Mockito不可能进行静态嘲讽,正如你所说,你不能使用PowerMock,那么@Jnorman的回答很好。使用spring-boot和mockito来实现这一点,您需要修改spring-boot-starter测试依赖项,以添加新版本的mockito,因为mockito 3.4.0支持静态mocking。

Mockito GitHub链接

https://github.com/mockito/mockito/issues/1013

改性聚甲醛

<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;
}
}

Mockito[3.4.0]可以模拟静态方法!

依赖项

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>3.4.0</version>
<scope>test</scope>
</dependency>

AT测试

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mockStatic;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
public class ATest {
A a = new A();
MockedStatic<B> b = mockStatic( B.class );
@Test
public void testMethodA() {
b.when( B::methodB ).thenReturn( 5 );
assertEquals( a.methodA(), 5 );
}
}

最新更新