我需要在Spring的ProductManager类中测试以下方法。 productService一个bean,并注入到ProductManager类中。我尝试使用Mockito编写Junit测试,但是它一直调用真正的productService.getProductIdList(email)方法而不是模拟方法。 ProductService也有一个@PostConstruct。谁能启发我测试代码出了什么问题?

@Named(ProductManager.NAME)
public class ProductManager {

@Resource(name = ProductService.NAME)
private ProductService productService;

    public static final String NAME = "productManager";

    public Set<Product> getProducts(String email) {
        Set<Integer> productList = productService.getProductIdList(email);
        Iterator<Integer> itr = productList.iterator();
        Set<Product> products = new HashSet<Product>();
        Product p = null;
        while (itr.hasNext()) {
            p = getProduct(itr.next());
            if (p != null) {
                products.add(p);
            }
        }
        return products;
    }


    public Product getProduct(Integer ProductId) {
        Product p = productService.getProduct(productId);
        return p;
    }

}


到目前为止,我已经遵循了Junit测试代码。

@Test
public void getProductByEmail(){

    String email = "[email protected]";

    ProductService  mockProductService = mock(ProductServiceImpl.class);

    Integer productId1 = 10000;
    Integer productId2 = 10002;

    Product p1 = mock(Product.class);
    Product p2 = mock(Product.class);
    when(p1.getProductId()).thenReturn(productId1);
    when(p2.getProductId()).thenReturn(productId2);

    Set<Integer> productIdSet = (Set<Integer>)mock(Set.class);
    productIdSet.add(productId1);
    productIdSet.add(productId2);
    Iterator<Integer> productIdIterator = (Iterator<Integer>)mock(Iterator.class);
    when(productIdSet.iterator()).thenReturn(productIdIterator);
    when(mockProductService.getProductIdList(email)).thenReturn(productIdSet);
    when(productIdIterator.hasNext()).thenReturn(true, true, false);
    when(productIdIterator.next()).thenReturn(productId1).thenReturn(productId2);
    when(productManager.getProduct(productId1)).thenReturn(p1);
    when(productManager.getProduct(productId2)).thenReturn(p2);

    Set<Product> products = productManager.getProducts(email);
    assertEquals(2, products.size());

}

最佳答案

我看不到将模拟的ProductService设置到ProductManager对象的任何位置。

您已经创建了一组复杂的相关对象,但是没有要求ProductManager使用它。

关于java - 具有Spring Bean依赖项的Junit/Mockito单元,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22823958/

10-09 00:22