我应该怎么做才能使用Mockito测试业务层?

时间:2019-12-04 10:33:57

标签: spring-boot mockito

在我的Spring Boot项目中使用Mockito时遇到问题。我应该怎么做才能测试业务层? (我只有建造者测试)。

公共类ProductBuilder {

private Product product;
private Collection<Product> products;

public static ProductBuilder mockProductBuilder() {
    ProductBuilder builder = new ProductBuilder();
    builder.product = new Product("Beer", "Alcholic", "20,99", "Montez");

    return builder;
}

public static ProductBuilder mockCollectionProductBuilder() {
    ProductBuilder builder = new ProductBuilder();
    builder.products = new ArrayList<Product>();

    for (int i = 0; i < 10; i++) {
        Product product = new Product("Beer " + i, "Alcholic", "20,99" + i, "Montez");

        builder.products.add(product);
    }

    return builder;
}

// Methods
public Product  getProduct() {
    return this.product;
}

public Collection<Product> getProducts() {
    return this.products;
}

5 个答案:

答案 0 :(得分:1)

您需要对类控制器,存储库和服务进行测试。您的构建器很好,您的控制器应该喜欢这样的东西

__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# dotenv
.env

# virtualenv
.venv
venv/
ENV/
.vscode
# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/

.DS_Store
*.sqlite3
media/
*.pyc
*.db
*.pid


# Dossier généré par l'IDE Pycharm
.idea

# No migrations
**/migrations/**
!**/migrations/**
!**/migrations/__init__.py

# VS Code
.vscode


答案 1 :(得分:0)

对于存储库

@RunWith(SpringRunner.class)

@SpringBootTest 公共类ProductRepositoryTest {

@Autowired
private ProductRepository productRepository;

private Product product;

@Before
public void setUp() {
    this.product = ProductBuilder.mockProductBuilder().getProduct();  
}

@After
public void after() {
    this.productRepository.deleteAll();
}

@Test
public void findAll() {
    Assert.assertThat(this.productRepository.findAll(), instanceOf(List.class));
}

@Test
public void findById() {
    Assert.assertThat(this.productRepository.findById((long) 2), instanceOf(Optional.class));
}

@Test
public void saveCreate() {

    this.product.setId((long) 1);
    this.product = this.productRepository.save(this.product);
    //Assert.assertNotEquals(this.product.getId(), 1);
}

@Test
public void saveUpdate() {

    this.product.setId((long) 0);
    this.product = this.productRepository.save(this.product);
    this.product.setNome("Jonas");
    Product productAtualizado = this.productRepository.save(this.product);
    Assert.assertEquals(productAtualizado.getNome(), this.product.getNome());
} 

@Test
public void deleteById() {
    this.product = this.productRepository.save(this.product);
    this.productRepository.deleteById(this.product.getId());

    Assert.assertEquals(this.productRepository.findAll().size(), 0);
}

答案 2 :(得分:0)

服务

@SpringBootTest 公共类ProductServiceTest {

@InjectMocks
private ProductService productService;

@Mock
private ProductRepository productRepository;

private Product productTest;
private List<Product> products;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    this.productTest = ProductBuilder.mockProductBuilder().getProduct();
    this.products = (List<Product>) ProductBuilder.mockCollectionProductBuilder().getProducts();
}

@Test
public void buscarTodosTest() {
    Mockito.when(this.productRepository.findAll()).thenReturn(this.products);

    List<Product> productsBd = this.productService.buscarTodos();

    assertEquals(productsBd, this.products);
}

@Test
public void buscarPeloId() {
    Optional<Product> productOptional = Optional.of(this.productTest);
    Mockito.when(this.productRepository.findById(this.productTest.getId())).thenReturn(productOptional);

    Product product = this.productService.buscarPeloId(this.productTest.getId());

    assertEquals(product, productOptional.get());
}

@Test
public void inserirTest() {
    Mockito.when(this.productRepository.save(this.productTest)).thenReturn(this.productTest);

    Product productSalvo = this.productService.inserir(this.productTest);

    assertEquals(productSalvo, this.productTest);
}

@Test
public void atualizarTest() {
    Optional<Product> productOptional = Optional.of(this.productTest);
    this.productTest.setId((long) 1);

    Mockito.when(this.productRepository.save(this.productTest)).thenReturn(this.productTest);
    Mockito.when(this.productRepository.findById(this.productTest.getId())).thenReturn(productOptional);

    Product productAtualizado = this.productService.atualizar(this.productTest);

    assertEquals(productAtualizado, this.productTest);
}

@Test
public void deletarTest() {
    Optional<Product> productOptional = Optional.of(this.productTest);

    Mockito.when(this.productRepository.findById(this.productTest.getId())).thenReturn(productOptional);

    this.productService.deletar(this.productTest.getId());

    Mockito.verify(this.productRepository, Mockito.times(1)).findById(this.productTest.getId());
}

答案 3 :(得分:0)

<!DOCTYPE html>
<html lang="en">

<head>

<meta charset="utf-8">
<meta name="viewport"
    content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="MyMusic">
<meta name="author" content="Victoria Brandt">

<title>Users - MyMusic</title>

</head>

<body>

<nav>

            <ul>
                <li><a href="/users">User</a></li>
                <li><a href="/musics">Music</a></li>
                <li><a href="/playlists">Playlist</a></li>
            </ul>
        </nav>

  <div>
    <div >

        <div>
            <strong><h2>Users</h2></strong>
        </div>
        </br>
        <div >
            <a th:href="@{/users/addUser}" >Add new user</a>
        </div>
        </br>
        <div>
            <div >

                <table >
                    <thead>
                        <tr>
                            <th>ID</th>
                            <th>Name</th>
                            <th>Location</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr th:each="user : ${users}">
                            <td th:text="${user.id}"></td>
                            <td th:text="${user.name}"></td>
                            <td th:text="${user.location}"></td>
                            <td >
                                <div >
                                    <a th:href="@{/users/editUser/{id}(id=${user.id})}" >Edit</a>
                                    <a class="delete btn btn-sm btn-danger" th:href="@{/users/deleteUser/{id}(id=${user.id})}">Delete</a>
                                </div>
                           </td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    </div>

</body>
</html>

答案 4 :(得分:0)

<!DOCTYPE html>
<html lang="en">

<head>

<meta charset="utf-8">
<meta name="viewport"
    content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="MyMusic">
<meta name="author" content="Victoria Brandt">

<title>Users - MyMusic</title>

</head>

<body>

    <nav> 
        <ul>
            <li><a href="/users">User</a></li>
            <li><a href="/musics">Music</a></li>
            <li><a href="/playlists">Playlist</a></li>
        </ul>
    </nav>


    <div>
        <div>

            <div>
                <strong><h2>Create new user</h2></strong>
            </div>
            </br>



            <div>
                <div>

                    <form th:object="${user}" th:action="@{/users/saveUser}"
                        method="POST">
                        <div>
                            <fieldset>
                                <div>
                                    <div th:if="${#fields.hasAnyErrors()}">
                                        <div th:each="detailedError : ${#fields.detailedErrors()}">
                                            <span th:text="${detailedError.message}"></span>
                                        </div>
                                    </div>
                                </div>
                                <div>
                                    <div>
                                        <input type="text" id="id" th:field="*{id}" readOnly="readonly" />
                                    </div>
                                </div>
                                <div>
                                    <div th:classappend="${#fields.hasErrors('name')}? 'has-error'">
                                        <label>Name</label> <input type="text" th:field="*{name}"
                                            autofocus="autofocus" />
                                    </div>
                                </div>

                                <div>
                                    <div
                                        th:classappend="${#fields.hasErrors('location')}? 'has-error'">
                                        <label>Location</label> <input type="text"
                                            th:field="*{location}" />
                                    </div>
                                </div>
                            </fieldset>
                        </div>
                        <div >
                            <button type="submit" >Save</button>
                            <a th:href="@{/users}">Cancel</a>
                        </div>
                    </form>

                </div>
            </div>
        </div>
    </div>

</body>
</html>