Mockito Exectues“何时到达”从以前的测试

发布于 2025-01-30 03:02:36 字数 1873 浏览 4 评论 0原文

当我分开运行这些测试时,它们工作正常,但是当我执行“在课堂中运行所有测试”时,test shopsaveproduct会失败。我得到了以前的测试中指定的异常(“ dataintegrityviolationException”)。它看起来像Mockito.When(productrepositorymock.save(any(任何()))。theReturn(product);不覆盖:

Mockito.when(productRepositoryMock.save(any())).thenThrow(new DataIntegrityViolationException("...SYMBOL_UQ..."));
@ExtendWith(MockitoExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class ProductServiceImplTest {

    private ProductService productService;
    private ProductRepository productRepositoryMock;

    @BeforeAll
    void setup() {
        productRepositoryMock = Mockito.mock(ProductRepository.class);
        productService = new ProductServiceImpl(productRepositoryMock);
    }
    
    @Test
    void shouldThrowProductExceptionBecauseOfDuplicateSymbol() {
        // given
        Product product = new Product();
        Mockito.when(productRepositoryMock.save(any()))
                .thenThrow(new DataIntegrityViolationException("...SYMBOL_UQ..."));
        // when && then
        ProductException exception = Assertions.assertThrows(ProductException.class, () ->
                productService.saveProduct(product), "Expected to throw ProductException");
        assertEquals(ProductExceptionMessage.SYMBOL_MUST_BE_UNIQUE, exception.getMessage());
    }
    
    @Test
    void shouldSaveProduct() {
        // given
        Product product = getProduct();
        Mockito.when(productRepositoryMock.save(any())).thenReturn(product);
        // when
        ProductTO resultProduct = productService.saveProduct(product);
        // then
        assertEquals(product.getName(), resultProduct.getName());
    }
}

当我使用@testinstance(testinstance.lifecycle.per_method)时代码>和@beforeeach,它有效,但我不明白为什么它不适用于上面介绍的配置。有人可以向我解释吗?

When I run these tests separetly, they work just fine but when I execute "run all tests in class", then test shouldSaveProduct fails. I get exception("DataIntegrityViolationException") which is specified in previous test. It looks like Mockito.when(productRepositoryMock.save(any())).thenReturn(product); does not override:

Mockito.when(productRepositoryMock.save(any())).thenThrow(new DataIntegrityViolationException("...SYMBOL_UQ..."));
@ExtendWith(MockitoExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class ProductServiceImplTest {

    private ProductService productService;
    private ProductRepository productRepositoryMock;

    @BeforeAll
    void setup() {
        productRepositoryMock = Mockito.mock(ProductRepository.class);
        productService = new ProductServiceImpl(productRepositoryMock);
    }
    
    @Test
    void shouldThrowProductExceptionBecauseOfDuplicateSymbol() {
        // given
        Product product = new Product();
        Mockito.when(productRepositoryMock.save(any()))
                .thenThrow(new DataIntegrityViolationException("...SYMBOL_UQ..."));
        // when && then
        ProductException exception = Assertions.assertThrows(ProductException.class, () ->
                productService.saveProduct(product), "Expected to throw ProductException");
        assertEquals(ProductExceptionMessage.SYMBOL_MUST_BE_UNIQUE, exception.getMessage());
    }
    
    @Test
    void shouldSaveProduct() {
        // given
        Product product = getProduct();
        Mockito.when(productRepositoryMock.save(any())).thenReturn(product);
        // when
        ProductTO resultProduct = productService.saveProduct(product);
        // then
        assertEquals(product.getName(), resultProduct.getName());
    }
}

When I use @TestInstance(TestInstance.Lifecycle.PER_METHOD) and @BeforeEach, then it works but I don't understand why it doesn't work with configuration presented above. Can anyone explain it to me?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

尝蛊 2025-02-06 03:02:36

因为这线

 @TestInstance(TestInstance.Lifecycle.PER_CLASS)

使JUNIT创建一个测试类的实例,并在测试之间重复使用。

Because this line

 @TestInstance(TestInstance.Lifecycle.PER_CLASS)

Its make Junit create one instance of the test class and reuse it between tests.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文