繁体   English   中英

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

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

认为我可以使用Twitter风格的切换星形按钮在网站上收藏电影,但是我只能收藏一部电影。

概率:

1)当我有喜欢的电影并决定喜欢另一部电影时,它将从旧电影中删除该喜欢的电影,并将喜欢的电影添加到新电影中(删除一行,插入一行)。

2)我已经喜欢上电影了。 因此,当我再次单击它时,它将被删除,这部电影将不受欢迎(删除一行)。

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

对于这3种可能性,我在后端Java代码中只有一个功能:

@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个测试函数,但是我不确定在没有返回任何值的情况下该怎么做。

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

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

您有2种方法可以执行此操作:

  • 无需更改后端代码:在您的测试函数中,针对所有3个概率,使用具有不同数据和预设数据库配置的updateFavorite(movieId)进行调用; 函数通过后, 不要检查返回的值,而是检查数据库数据 您的测试是否成功应该有一个答案。
  • 更改后端代码:updateFavorite(movieId)函数按每种概率分成3个小函数并分别进行测试可能很方便。 在这种情况下,您也可以不测试数据库,而可以测试决策,您的功能逻辑是根据这3个概率中的哪个做出的

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

您可以执行以下操作,例如,通过创建一个数据库,该数据库已经包含具有喜欢的电影的用户,应用该功能,然后直接通过对照数据库检查是否其他电影是喜欢的电影。 使用EntityManager在内存中的数据库将是一个好主意。 尽量不要将某些开发数据库用于自动测试,其他客户端也可以访问该数据库。 使用非常本地的设备,并且最好在每次测试时都可以对其进行设置和拆除(因此建议使用内存数据库)。

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

提供更具体的帮助(例如代码)将需要更多有关当前如何执行测试以及应该进行总体设置的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM