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

时间:2020-07-15 15:07:02

标签: java junit mockito

我的代码:

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

3 个答案:

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

ATest

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-inline</artifactId>
            <version>3.4.0</version>
            <scope>test</scope>
        </dependency>
相关问题