前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java测试框架推荐

Java测试框架推荐

原创
作者头像
CoffeeLand
修改2020-05-18 11:25:58
1.4K0
修改2020-05-18 11:25:58
举报
文章被收录于专栏:CoffeeLand

一个好的,稳健的系统, 是函数经过数次稳健的UT测试, API和Service之间是经过BDD测试的

Java测试框架介绍

java有很多测试类框架, 开发中有很多比如Mokito, powermock, wiremock, cucumber ,但是powermock测试,sonar不认其覆盖率.

Mockito

What is mock

Mocking is primarily used in unit testing. An object under test may have dependencies on other (complex) objects. To isolate the behavior of the object you want to replace the other objects by mocks that simulate the behavior of the real objects. This is useful if the real objects are impractical to incorporate into the unit test.

From <https://stackoverflow.com/questions/2665812/what-is-mocking>

以下所有的例子以下图为依据, 写UserImp的UT UserImplTest

Import mockito

代码语言:javascript
复制
//build.gradlew
repositories { jcenter() }
dependencies { 
	testCompile "org.mockito:mockito-core:2.+" 
	// https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4
	testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.2'
	
	}


// 遇到以下错误需要导入

java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)

	at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:74)
	at com.sun.proxy.$Proxy8.isTypeMockable(Unknown Source)
	at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:29)
	at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22)
	at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:240)
	at org.mockito.internal.creation.MockSettingsImpl.build(MockSettingsImpl.java:228)
	at org.mockito.internal.MockitoCore.mock(MockitoCore.java:61)
	at org.mockito.Mockito.mock(Mockito.java:1908)

Mock and injectMock

代码语言:javascript
复制
@Mock 用来mock 独立没有依赖的类
@InjectMock 用于去mock有依赖的类
For dependent classes, we used mocks.
From <https://howtodoinjava.com/mockito/mockito-mock-injectmocks/> 


import com.kaifei.model.User;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

import java.util.ArrayList;
import java.util.List;

public class UserImplTest {

    @Mock
    UserHandler userHandler;

    @InjectMocks
    UserImpl userImpl;

    @Before
    public void before()
    {
        //Initializes objects annotated with Mockito annotations for given testClass: @Mock, @Spy, @Captor, @InjectMocks
        //See examples in javadoc for MockitoAnnotations class.
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testGetAllUser()
    {
        //given
        User james = new User("james", 23);
        ArrayList<User> objects = new ArrayList<>();
        objects.add(james);
        Mockito.when(userHandler.getAll()).thenReturn(objects);

        //when
        List<User> actUsers = userImpl.getaAllUsers();

        //then
        Assert.assertEquals("get all done!", objects, actUsers);
    }

}

mock方法的返回值

代码语言:javascript
复制
 Mockito.when(sharingDataHandler.createSharingData()).thenReturn(sharingUuid);

Mock方法被执行了一次

用来测void方法

代码语言:javascript
复制
    @Test
    public void testCreateUser200()
    {
        //given
        User james = new User("james", 23);

        //when
        userImpl.creatUser(james);

        //then verify the UserHandler::createUser was executed only once
        Mockito.verify(userHandler, Mockito.times(1)).createUser(james);
    }

Mock throw exception

代码语言:javascript
复制
@Test(expected = NullPointerException.class)
    public void testCreatUser()
    {
        //given
        User james = new User("james", 23);
        
        //when
        userImpl.creatUser(james);
        
        //then
        //catch NullPointerException exception
    }

RabbitMQ clear Message

代码语言:javascript
复制
  @Autowired
 private MessageCollector messageCollector;
@After("@CleanAllMessages")
 public final void cleanAllMessages()
 {
 try
 {
 mockMvc.perform(
 delete("/messages/").contentType(MediaType.APPLICATION_JSON_UTF8_VALUE).content("[]"));
 messageCollector.forChannel(messageSource.statusmessageChannel()).clear();
 }
 catch (Exception e)
 {
 throw new CucumberException("Stopped at \"user invokes root cleanAllMessages:\"", e);
 }
 }

Cucumber

cucum是BDD测试框架的一个工具, 能够测试组件与组件之间的API调用, service里API的测试

https://cloud.tencent.com/developer/article/1628939

WireMock

代码语言:javascript
复制
Mock your APIs for fast, robust and comprehensive testing
WireMock is a simulator for HTTP-based APIs. Some might consider it a service virtualization tool or a mock server.

It enables you to stay productive when an API you depend on doesn't exist or isn't complete. It supports testing of edge cases and failure modes that the real API won't reliably produce. And because it's fast it can reduce your build time from hours down to minutes.

wireMock site

http://wiremock.org/

References

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java测试框架介绍
  • Mockito
    • What is mock
      • Import mockito
        • Mock and injectMock
          • mock方法的返回值
            • Mock方法被执行了一次
              • Mock throw exception
                • RabbitMQ clear Message
            • Cucumber
            • WireMock
              • wireMock site
              • References
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档