春天 – 为什么Mockito没有被触发?

我需要测试一个服务类,但是当我尝试模拟dao类时,它不会被触发,因此无法使用ThenReturn().

我认为问题是因为我在服务类(Spring MVC 3.1)中为我的Dao和@Autowired使用了一个接口:

界面:

public interface TestDao {
    int createObject(Test test) throws NamingException;
}

实施:

@Repository
public class TestDaoImpl implements TestDao {

    @Override
    public int createObject(Test test) {
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new InsertNewTest(test), keyHolder);
        return ((java.math.BigDecimal)keyHolder.getKey()).intValue();
    }
}

服务:

public class RegTest {
    @Autowired
    TestDao testDao;

    public int regTest(int .....) {
        .
        .
        int cabotageId = testDao.createObject(test);
    }
}

在测试中我有:

@RunWith(MockitoJUnitRunner.class)
public class TestRegService {
    @InjectMocks
    private RegTest regTest = new RegTest();

    @Mock
    TestDao testDao;

    @Test()
    public void test() {
        .
        when(testDao.createObject(null)).thenReturn(100);
        .
    }

testDao.createObject(null)返回0(由于被模拟)而不是100,正如我试图实现的那样.

请帮忙吗?

问题解决了!

传递的测试对象与createObject()不匹配.运用

testDao.createObject(any(Test.class))

做了伎俩!

解决方法:

如果您的测试实际上是将值传递给createObject,那么当(testDao.createObject(null)…永远不会匹配.而不是匹配null时,您可以将Test的任何实例与testDao.createObject匹配(任何(Test.class) ))…

此外,当您稍后尝试提供新的Test()作为匹配的参数时,它将真正尝试匹配该测试的确切实例,但可能您的真实代码正在新建一个不同的代码.因此,使用Matchers.any(Test.class)作为匹配的参数是要走的路.

上一篇:java – 模拟一个返回未来以抛出异常的方法


下一篇:java – 我可以只使用powermock mockito junit来模拟一些静态方法吗?