如何为具有 3 个概率的 void 函数编写 JUnit 测试?

How can I write a JUnit test for a void function with 3 probabilities?

以为我可以在一个网站上通过 twitter-style 切换星标按钮来收藏电影,但我只能收藏一部电影。

概率:

1) 当我有一个最喜欢的电影并决定收藏另一部电影时,它会从旧电影中删除最喜欢的电影并为新电影添加最喜欢的电影(删除一行,插入一行)。

2) 我已经收藏了这部电影。所以当我再次点击它时,它将被删除,电影将不被收藏(删除一行)。

T3) 我没有最喜欢的电影。当我点击收藏电影时,它会将电影指定为我的收藏(插入一行)。

我的后端有一个函数 java 这 3 个概率的代码:

@PUT
@Path("/updateFavorite/{newMovieId}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public void updateFavorite(@PathParam("newMovieId") int newMovieId) {
    EntityManager entityManager = entityManagerFactory
            .createEntityManager();

    try {
        boolean removeFavorite = false;

        entityManager.getTransaction().begin();

        MovieEntity newMovie = fetchMovieWithId(entityManager, newMovieId);

        int movieGenre = newMovie.getMovieGenre();

        if (favoriteMovieExists(entityManager, movieGenre)) {
            FavoriteMovieEntity existingFavoriteMovie = fetchFavoriteMovieWithGenre(
                    entityManager, movieGenre);
            // If existing movie and the current movie are the
            // same, than it is a 'remove favorite' click
            if (existingFavoriteMovie.getMovieId() == newMovie.getMovieId()) {
                removeFavorite = true;
            }
            entityManager.remove(existingFavoriteMovie);
        }
        // it is not already favorited, create a new favorite
        if (!removeFavorite) {
            FavoriteMovieEntity newFavoriteMovie = new FavoriteMovieEntity();
            FavoriteMoviePK newFavoritePK = new FavoriteMoviePK(getUser(),
                    movieGenre);

            newFavoriteMovie.setKey(newFavoritePK);
            newFavoriteMovie.setMovieId(newMovieId);

            entityManager.persist(newFavoriteMovie);
        }
        entityManager.getTransaction().commit();
    } catch (Exception ex) {
        ex.printStackTrace();
        if (entityManager.getTransaction().isActive()) {
            entityManager.getTransaction().rollback();
        }
    } finally {
        entityManager.close();
    }
}

我决定为每个概率编写 3 个测试函数,但我不确定如果没有任何返回值我该怎么办。

您基本上想要尝试做的是创建一个已定义的(!)环境状态,应用您的函数,检查对环境的影响是否符合预期。

您可以这样做,例如通过创建一个已经包含有最喜欢电影的用户的数据库,应用该函数,然后通过直接检查数据库来检查另一部电影是否是最喜欢的电影。使用 EntityManager 内存数据库是个好主意。尽量不要将某些开发数据库用于也被其他客户端访问的自动化测试。使用对您的机器来说非常本地化的东西,以及可以在每次测试时理想地设置和拆除的东西(因此建议使用内存数据库)。

另一种方法是模拟部分代码并确保调用适当的回调。例如。您可以模拟 EntityManager 并确保正确调用了 persist 和 remove 方法。一个好的框架可能是 mockito

提供更具体的帮助(即代码)将需要更多关于当前如何执行测试以及整体设置应该是什么的输入。

您需要编写 3 个测试函数:

  1. testFavoriteExistReplace()
  2. testFavoriteExistUnfavorite()
  3. testFavoriteNotExistCreateNew()

您有 2 个选择:

  • 不更改后端代码: 在您的测试函数中调用您的 updateFavorite(movieId) 并为所有 3 个概率使用不同的数据和预设数据库配置;函数通过后不检查返回值,而是检查数据库数据。你测试成功与否,应该会有一个答案。
  • 更改后端代码: 将您的 updateFavorite(movieId) 函数按每个概率拆分为 3 个小函数并单独测试它们可能很方便。在这种情况下,您还可以测试不是数据库,而是您的函数逻辑做出的决定这是 3 个概率中的哪一个。