Java 如何在方法中测试业务逻辑?

Java 如何在方法中测试业务逻辑?,java,testing,mockito,Java,Testing,Mockito,我的服务层中有这样的方法: public Long calculateItemsCostInShoppingCart(Long shoppingCartId) { List<Item> items = shoppingCartRepository.findAllItems(shoppingCartId); Long cost = 0L; for (Item item : items) { cost += item.getPrice();

我的服务层中有这样的方法:

public Long calculateItemsCostInShoppingCart(Long shoppingCartId) {
    List<Item> items = shoppingCartRepository.findAllItems(shoppingCartId);
    Long cost = 0L;
    for (Item item : items) {
        cost += item.getPrice();
    }
    return cost;
}
public Long calculateItemsCostInShoppingCart(Long shoppingCartId){
列表项=shoppingCartRepository.findAllItems(shoppingCartId);
长期成本=0升;
用于(项目:项目){
成本+=物料。getPrice();
}
退货成本;
}
我需要测试列表中所有项目的汇总成本计算。我考虑过mockito,但没有成功,因为mockito只是创建存根,我需要真实的入口数据和基于它们的结果。你怎么能做到

//  create mock
ShoppingRepository mock = mock(ShoppingRepository.class);

// define return value for method findAllItems()
when(mock.findAllItems()).thenReturn(listOf(...));
我需要测试列表中所有项目的汇总成本计算

在这种情况下,您必须隔离不执行任何计算的
shoppingCartRepository
依赖项。

我需要真实的入学数据和基于它们的结果。你怎么能做到

//  create mock
ShoppingRepository mock = mock(ShoppingRepository.class);

// define return value for method findAllItems()
when(mock.findAllItems()).thenReturn(listOf(...));
它描述了一个集成测试。在这种情况下,不要使用Mockito

到单元测试:

您必须模拟依赖关系,并且还需要一种在被测试类的实例中设置依赖关系的方法。
构造函数通常是一种很好的方法(让我们调用测试中的类
MyService
):

然后,在测试中,您应该模拟
ShoppingCartRepository
,记录
findAllItems()
的行为,并在MyService的构造函数中通过模拟

@Mock
private ShoppingCartRepository shoppingCartRepositoryMock;

@Test
public void calculateItemsCostInShoppingCart(){

   Long cartId = Long.valueOf(123);   

   // set the dependency
   MyService myService = new MyService(shoppingCartRepositoryMock);

   // create the mock
   Mockito.when(shoppingCartRepositoryMock.findAllItems(cartId))
          .thenReturn(createMockedItems());

   //action
   Long actualCost = myService.calculateItemsCostInShoppingCart(cartId);

   // assertion
   Assert.assertEquals(expectedCost, actualCost);
}

 private List<Item> createMockedItems() { ... }
@Mock
私人购物车存储库购物车存储库模拟;
@试验
public void calculateItemsCostInShoppingCart()的计算{
Long cartId=Long.valueOf(123);
//设置依赖项
MyService MyService=newmyservice(shoppingCartRepositoryMock);
//创建模拟
Mockito.when(shoppingCartRepositoryMock.findAllItems(cartId))
.thenReturn(createMockedItems());
//行动
Long actualCost=myService.calculateItemsCostInShoppingCart(cartId);
//断言
资产质量(预期成本、实际成本);
}
私有列表createMockedItems(){…}
我需要测试列表中所有项目的汇总成本计算

在这种情况下,您必须隔离不执行任何计算的
shoppingCartRepository
依赖项。

我需要真实的入学数据和基于它们的结果。你怎么能做到

//  create mock
ShoppingRepository mock = mock(ShoppingRepository.class);

// define return value for method findAllItems()
when(mock.findAllItems()).thenReturn(listOf(...));
它描述了一个集成测试。在这种情况下,不要使用Mockito

到单元测试:

您必须模拟依赖关系,并且还需要一种在被测试类的实例中设置依赖关系的方法。
构造函数通常是一种很好的方法(让我们调用测试中的类
MyService
):

然后,在测试中,您应该模拟
ShoppingCartRepository
,记录
findAllItems()
的行为,并在MyService的构造函数中通过模拟

@Mock
private ShoppingCartRepository shoppingCartRepositoryMock;

@Test
public void calculateItemsCostInShoppingCart(){

   Long cartId = Long.valueOf(123);   

   // set the dependency
   MyService myService = new MyService(shoppingCartRepositoryMock);

   // create the mock
   Mockito.when(shoppingCartRepositoryMock.findAllItems(cartId))
          .thenReturn(createMockedItems());

   //action
   Long actualCost = myService.calculateItemsCostInShoppingCart(cartId);

   // assertion
   Assert.assertEquals(expectedCost, actualCost);
}

 private List<Item> createMockedItems() { ... }
@Mock
私人购物车存储库购物车存储库模拟;
@试验
public void calculateItemsCostInShoppingCart()的计算{
Long cartId=Long.valueOf(123);
//设置依赖项
MyService MyService=newmyservice(shoppingCartRepositoryMock);
//创建模拟
Mockito.when(shoppingCartRepositoryMock.findAllItems(cartId))
.thenReturn(createMockedItems());
//行动
Long actualCost=myService.calculateItemsCostInShoppingCart(cartId);
//断言
资产质量(预期成本、实际成本);
}
私有列表createMockedItems(){…}

您可以使用放心库进行测试
获取Rest assured response对象,并为list的方法对象调用方法

@BeforeClass
public static void init() {
    RestAssured.baseURI = "http://localhost";
    RestAssured.port = 8080;
}
@Test
public void testUserRegistration() {
    Response response = 
            RestAssured
            .given()
            .get(URL_LOGIN)
            .then()
            .assertThat()
            .statusCode(200);

    Assert.assertThat(200, Matchers.is(200));
    Assert.assertThat(response.getStatusCode(), Matchers.is(200));
}

您可以使用Rest-assured库进行测试
获取Rest assured response对象,并为list的方法对象调用方法

@BeforeClass
public static void init() {
    RestAssured.baseURI = "http://localhost";
    RestAssured.port = 8080;
}
@Test
public void testUserRegistration() {
    Response response = 
            RestAssured
            .given()
            .get(URL_LOGIN)
            .then()
            .assertThat()
            .statusCode(200);

    Assert.assertThat(200, Matchers.is(200));
    Assert.assertThat(response.getStatusCode(), Matchers.is(200));
}

假设您正在开发一个在应用服务器上运行的JavaWeb应用程序,另一个选择可能是使用Arquillian()。简而言之,Arquillian是一个框架,允许您在它将运行的环境中测试逻辑。但是将Arquillian集成到您的项目中可能需要一些工作。我们在几个项目中使用Arquillian,到目前为止,它运行良好。即使是Alpha版本的持久性模块也能很好地工作

假设您正在开发一个在应用服务器上运行的Java web应用程序,另一个选择可能是使用Arquillian()。简而言之,Arquillian是一个框架,允许您在它将运行的环境中测试逻辑。但是将Arquillian集成到您的项目中可能需要一些工作。我们在几个项目中使用Arquillian,到目前为止,它运行良好。即使是Alpha版本的持久性模块也能很好地工作

下面是一个使用Mockito进行测试的示例:

public class SomeCalculatorTest {

    @Mock
    private ShoppingCartRepository shoppingCartRepository;

    @InjectMocks
    private SomeCalculator someCalculator = new SomeCalculator();

    @Before
    public void setUp() {
        initMocks(this);
    }

    @Test
    public void testEmptyItemsList() {
        when(shoppingCartRepository.findAllItems(any())).thenReturn(new ArrayList<>());
        final Long result = someCalculator.calculateItemsCostInShoppingCart(1L);
        assertThat(result, is(0L));
    }

    @Test
    public void testOneItemInList() {
        when(shoppingCartRepository.findAllItems(any())).thenReturn(Arrays.asList(new ItemImpl(25L)));
        final Long result = someCalculator.calculateItemsCostInShoppingCart(1L);
        assertThat(result, is(25L));
    }

    @Test
    public void testTwoItemInList() {
        when(shoppingCartRepository.findAllItems(any())).thenReturn(Arrays.asList(new ItemImpl(25L), new ItemImpl(12L)));
        final Long result = someCalculator.calculateItemsCostInShoppingCart(1L);
        assertThat(result, is(37L));
    }
}
公共类SomeCalculatorTest{
@嘲弄
私人购物车存储库购物车存储库;
@注射模拟
私有SomeCalculator SomeCalculator=新的SomeCalculator();
@以前
公共作废设置(){
initMocks(这个);
}
@试验
public void testEmptyItemsList(){
when(shoppingCartRepository.findAllItems(any())。然后return(newarraylist());
最终长结果=someCalculator.calculateItemsCostInShoppingCart(1L);
资产(结果为(0L));
}
@试验
public void testOneItemInList(){
when(shoppingCartRepository.findAllItems(any())。然后return(Arrays.asList(newitempl(25L));
最终长结果=someCalculator.calculateItemsCostInShoppingCart(1L);
资产(结果为(25L));
}
@试验
public void testTwoItemInList(){
when(shoppingCartRepository.findAllItems(any())。然后return(Arrays.asList(newitempl(25L)、newitempl(12L));
最终长结果=someCalculator.calculateItemsCostInShoppingCart(1L);
资产(结果为(37L));
}
}

下面是一个如何使用Mockito进行测试的示例:

public class SomeCalculatorTest {

    @Mock
    private ShoppingCartRepository shoppingCartRepository;

    @InjectMocks
    private SomeCalculator someCalculator = new SomeCalculator();

    @Before
    public void setUp() {
        initMocks(this);
    }

    @Test
    public void testEmptyItemsList() {
        when(shoppingCartRepository.findAllItems(any())).thenReturn(new ArrayList<>());
        final Long result = someCalculator.calculateItemsCostInShoppingCart(1L);
        assertThat(result, is(0L));
    }

    @Test
    public void testOneItemInList() {
        when(shoppingCartRepository.findAllItems(any())).thenReturn(Arrays.asList(new ItemImpl(25L)));
        final Long result = someCalculator.calculateItemsCostInShoppingCart(1L);
        assertThat(result, is(25L));
    }

    @Test
    public void testTwoItemInList() {
        when(shoppingCartRepository.findAllItems(any())).thenReturn(Arrays.asList(new ItemImpl(25L), new ItemImpl(12L)));
        final Long result = someCalculator.calculateItemsCostInShoppingCart(1L);
        assertThat(result, is(37L));
    }
}
公共类SomeCalculatorTest{
@嘲弄
私人购物车存储库购物车存储库;
@注射模拟
私有SomeCalculator SomeCalculator=新的SomeCalculator();
@以前
公共作废设置(){
initMocks(这个);
}
@试验
公共图书馆