【问题标题】:JUnit test with Mockito using Java使用 Java 使用 Mockito 进行 JUnit 测试
【发布时间】:2016-01-19 13:19:36
【问题描述】:

我必须编写一些单元测试,现在我有一些,但我决定发布一个主题,因为我不知道测试是否正确,尽管它们在 Eclipse 中运行并且 EclEmma 显示测试涵盖了测试代码(突出显示绿色)。一句话就是单元测试正确。

我将测试的方法

@Service
@Configurable
public class UserManager {

@Autowired
private UserManagerDao umDao;

public long getUserId(String email) throws Exception {
        String[] partsOfEmail = email.split("@");
        return umDao.getUserId(partsOfEmail [0], partsOfEmail [1]);
    }
}

道类

public class UserManagerDao extends JdbcDaoSupport {


    @Autowired
     private MessageSourceAccessor msa;

    public long getUserId(String userName, String domain) throws Exception {
        String sql = msa.getMessage("sql.select.user_id");
        Object[] params = new Object[] { userName, domain };

        List<Long> result = getJdbcTemplate().queryForList(sql, params, Long.class);

        if (result.size() > 0) {
            return result.get(0);
        }

        return 0;
    }

测试

  @RunWith(MockitoJUnitRunner.class)
  public class UserManagerTest {

     @Mock
     UserManagerDao umDao;

    private String email = "email@email.com";

    @Test
    public void testGetPassportUserId() throws Exception {
            um.getPassportUserId(email);
        }

   }

【问题讨论】:

  • 你可能想用谷歌搜索JUnit tutorial

标签: java unit-testing junit mockito


【解决方案1】:

快速回答是“不完全”。

您的代码似乎不完整 - 例如,在您的测试中,您调用 um.getPassportUserId(email),但未声明 um(我假设它是 UserManager 并以某种方式注入?),我看不到任何方法叫getPassportUserId。忽略这些点,我能看到的最大问题是您在测试中没有断言;您没有检查该方法是否返回您期望的结果。

测试的一个常见模式是“Given,When,Then”,这意味着您的测试应该以“given”部分开始 - 也就是说,它设置 mock(s) 以返回您需要的任何内容,然后是 ' when' 应该是你的方法调用,'then' 检查方法调用的结果。

因此,对于您的示例,在伪代码中,我希望是这样的:

@Test
public void testGetPassportUserId() throws Exception {
  // Given...
  String username = "foo";
  String domain = "bar";
  long expectedId = 1L;

  // Use Mockito to tell the mocked umDao to return expectedId when you request "foo@bar"

  // When...
  long actualId = um.getPassportUserId(username + "@" + domain);

  // Then...
  // Use an assertion to ensure that actualId = expectedId
}

我故意让这个非常开放,因为对于如何设置模拟有很多正确的答案(查看 Mockito 文档),甚至还有更正确的断言方法(查看 JUnit 文档,以及Mockito 和 Hamcrest)。

顺便说一句,这是与代码覆盖工具相关的潜在陷阱的一个很好的例子。 Emma 在告诉您所有代码都已执行方面做得完全正确,因为它已经执行了,但是您无法知道执行是否正确,而无需在测试中执行一些断言,因此它给了您一个错误安全感。

【讨论】:

  • 这是一个正确的断言 - assertEquals(1L, user.getId());
  • 如果你的方法返回一个user,它的形式是正确的。从上面看起来它只是返回一个long,但你肯定有正确的想法。我最好的学习这种东西的建议是尝试一下,看看会发生什么。每当您立即通过测试时,故意使其失败,通过更改断言中的“预期”值或更改正在测试的代码,以说服自己通过是“真正的”通过。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 2016-10-21
相关资源
最近更新 更多