mockito 使用final参数的模拟方法

vx6bjr1n  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(224)

我有一些方法在ServiceClassA中使用了final String参数。

@Service
public class ServiceClassA {

    public String callingMethod(final String argOne, final String argTwo) {
        //Implementation here
    }

}

以及它在另一个类ServiceClassB中的另一个方法内的调用。

@Service
public class ServiceClassB {
    private final ServiceClassA serviceClassA;

    public MyResponse methodB() {
        String inputOne = "111";
        String inputTwo = MyEnum.AAA.getDescription();

        final String result = serviceClassA.callingMethod(inputOne,inputTwo);

        //some implementations

        MyResponse response = new MyResponse();
        //set values to response

        return response;
    }
}

还存在一个枚举。

public enum MyEnum {
    AAA(1, "AAA"), BBB(2,"BBB");

    private static final Map<Integer, MyEnum> MYENUM_MAP = new HashMap<>();

    static {
        for (MyEnum myEnum : values()) {
            MYENUM_MAP.put(myEnum.getValue(), myEnum);
        }
    }

    private final int value;
    private final String description;

    private MyEnum(int value, String description) {
        this.value = value;
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public int getValue() {
        return value;
    }
}

我正在使用mockito和JUnit测试ServiceClassB。当我尝试模拟调用ServiceClassA中的方法时,它返回空值而不是“SUCCESS”。

@RunWith(MockitoJUnitRunner.class)
public class ServiceClassBTest {

    @InjectMocks
    private ServiceClassB serviceClassB;

    @Mock
    private ServiceClassA serviceClassA;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void methodB_success(){
        String result = "SUCCESS";

        when(serviceClassA.callingMethod(Mockito.anyString(), Mockito.anyString())).thenReturn(result); 
    }
}

我试了几种方法,结果都是空的。但是我想得到的结果是成功。

when(myService.callingMethod(Mockito.anyString(), Mockito.anyString())).thenReturn(result); //return null
when(myService.callingMethod(Mockito.any(), Mockito.any())).thenReturn(result); //return null
when(myService.callingMethod(ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(result); //return null
doReturn(result).when(myService).callingMethod(Mockito.anyString(), Mockito.anyString()); //return null
ffscu2ro

ffscu2ro1#

这里的问题是,您将@RunWith(MockitoJUnitRunner.class)与MockitoAnnotations.initMocks(this)一起使用,它们是冲突的。
使用MockitoJUnitRunnerMockitoAnnotations.initMocks中的一个。
MockitoJUnitRunner初始化用Mock注解的模拟,这样就不需要显式使用MockitoAnnotations.initMocks(Object)。模拟在每个测试方法之前初始化。
工作试验:

@RunWith(MockitoJUnitRunner.class)
public class ServiceClassBTest {

    @InjectMocks
    private ServiceClassB serviceClassB;

    @Mock
    private ServiceClassA serviceClassA;

    @Test
    public void methodB_success(){
        String result = "SUCCESS";

        when(serviceClassA.callingMethod(Mockito.anyString(), Mockito.anyString())).thenReturn(result);

        serviceClassB.methodB();
    }
}

相关问题