java:在泛型方法中使用mock参数,它会产生错误

时间:2018-03-16 09:39:57

标签: java testing mocking mockito

我在测试中使用了TestNG和Mock。它发生了一个混乱的问题,我在网上搜索了很长时间。我需要你的帮助......亲爱的

我想对此方法进行测试

@Override
public boolean addAreaToDB(String areaName, Integer areaCode) {
   if (isAreaExists(areaCode)) {
     return false;
   }
   Area area = new Area(areaCode, areaName);
   areaDao.save(area);
   onlineDiskService.initFoldersAndPrime(areaCode);
   return true;
}

我尝试了以下方法:

  @InjectMocks
  private AreaServiceImpl areaService;
  @Mock
  private IAreaDAO areaDao;
  @Mock
  private OnlineDiskService onlineDiskService;

  @BeforeTest
  public void before() {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void testAddAreaToDB() {
    String areaName="";
    Integer areaCode=0;

    //first:
    Area area = new Area();
    when(areaDao.getByAreaCode(anyInt())).thenReturn(area);
    areaService.addAreaToDB(areaName, areaCode);

    //second:
    when(areaDao.getByAreaCode(anyInt())).thenReturn(area);
    areaService.addAreaToDB(anyString(), areaCode);

    //third:
    when(areaDao.getByAreaCode(anyInt())).thenReturn(area);
    areaService.addAreaToDB(areaName, anyInt());

    //forth:
    when(areaDao.getByAreaCode(anyInt())).thenReturn(area);
    areaService.addAreaToDB(anyString(), anyInt());
  }

前三个是好的,但最后一个报告错误。

    org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
    Invalid use of argument matchers!
    1 matchers expected, 2 recorded:
    -> at 
 com.tal.peiyoupad.service.impl.AreaServiceImplTest.testAddAreaToDB(AreaServiceImplTest.java:69)
   -> at 
 com.tal.peiyoupad.service.impl.AreaServiceImplTest.testAddAreaToDB(AreaServiceImplTest.java:69)

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

    For more info see javadoc for Matchers class.

我搜索了网。答案都是关于什么时候(方法(模拟)),没有关于我的问题的答案。请帮帮我,

1 个答案:

答案 0 :(得分:1)

您不能在这些Mockito调用中混合使用匹配器和常规变量。换句话说,请使用Matchers.eq( areaName )代替areaName。只要使用一个匹配器,就不能再使用正常值。要么所有参数都是匹配器都没有

完全可以:

when(something( myVariable1, myVariable2, "string", 4)).then(...);
when(something( any(), any(), eq("string"), eq(4)).then(...);

不行:

when(something( any(), any(), "string", 4).then(...);