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

时间:2015-04-15 16:43:05

标签: java jpa junit

认为我可以在网站上使用推特式切换星形按钮来收藏电影,但我只能拥有一部喜欢的电影。

概率:

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个测试函数,但我不知道如果没有返回任何值我该怎么做。

2 个答案:

答案 0 :(得分:1)

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

  1. testFavoriteExistReplace()
  2. testFavoriteExistUnfavorite()
  3. testFavoriteNotExistCreateNew()
  4. 您有两个选项可以执行此操作:

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

答案 1 :(得分:0)

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

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

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

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