用于 try 和 catch 块覆盖的 JUnit

新手上路,请多包涵

我正在尝试为下面的代码编写一个 JUnit,但我不知道如何覆盖 catch 块语句中编写的代码。请任何人为下面的代码编写一个示例 JUnit。

在这里我不想涵盖任何异常,但想涵盖使用 Mockito 在 catch 块中编写的代码行。

 public Product getProductLookUpData() {

        Product product = null;
        try{
            // Try to get value from cacheable method
            product = productCacheDao.getProductLookUpData();
            .....//statements
        } catch (Exception ex) {
            // getting value from db
            product = productDao.getIpacMetricCodeLookUpData();
            ....//statements
        }

        return product;
    }

原文由 John 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

您可以同时 模拟 productCacheDaoproductDao 并检查这些方法在您的测试用例中被调用了多少次。您可以使用这些模拟对象模拟异常抛出,如下所示:

 when(mockObject.method(any())).thenThrow(new IllegalStateException());

所以,对于你的情况,我会做这样的事情:

 import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import static org.mockito.Mockito.*;

public class ProductTest {
    private static final Product CACHED_PRODUCT = new Product("some parameters for cached product");
    private static final Product DB_PRODUCT = new Product("some parameters for DB product");

    private ProductService service;
    private ProductDao productDaoMock;
    private ProductCacheDao productCacheDaoMock;

    @Before
    public void setup() {
        service = new ProductService();
        productDaoMock = mock(ProdoctDao.class);
        service.setProductDao(productDaoMock);

        productCacheDaoMock = mock(ProdoctCacheDao.class);
        service.setProductCacheDao(productCacheDaoMock);
    }

    @Test
    public void testCache() {
        when(productCacheDaoMock.getProductLookUpData(any())).thenReturn(CACHED_PRODUCT);

        final Product product = service.getProductLookUpData();

        Assert.assertEquals(CACHED_PRODUCT, product);
        verify(productCacheDaoMock, times(1)).getProductLookUpData(any());
        verify(productDaoMock, never()).getIpacMetricCodeLookUpData(any());
    }

    @Test
    public void testDB() {
        when(productCacheDaoMock.getProductLookUpData(any())).thenThrow(new IllegalStateException());
        when(productDaoMock.getIpacMetricCodeLookUpData(any())).thenReturn(DB_PRODUCT);

        final Product product = service.getProductLookUpData();

        Assert.assertEquals(DB_PRODUCT, product);
        verify(productCacheDaoMock, times(1)).getProductLookUpData(any());
        verify(productDaoMock, times(1)).getIpacMetricCodeLookUpData(any());
    }
}

原文由 esin88 发布,翻译遵循 CC BY-SA 3.0 许可协议

可以使用 Mockito 或其他模拟框架。您将需要两个测试用例 - 抛出异常和不抛出异常。您可以模拟您的 DAO 以返回一个已知对象,以便验证您的服务是否表现出正确的行为。

我在下面写了一个完整的例子。

 public class MocksExample {

    private ProductService service;
    @Mock
    private ProductDao productDao;
    @Mock
    private ProductCacheDao productCacheDao;
    @Mock
    private Product product;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        service = new ProductService();
        service.setProductCacheDao(productCacheDao);
        service.setProductDao(productDao);
    }

    @Test
    public void serviceReturnsProduct() {
        when(productCacheDao.getProductLookUpData()).thenReturn(product);
        assertThat(service.getProductLookUpData(), is(product));
    }

    @Test
    public void ipacProductReturnedWhenDaoThrowsException() {
        when(productDao.getIpacMetricCodeLookUpData()).thenReturn(product);
        when(productCacheDao.getProductLookUpData()).thenThrow(new IllegalStateException("foo"));
        assertThat(service.getProductLookUpData(), is(product));
    }
}

原文由 Adam 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题