日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了如何與其約束驗證器一起對方法進行單元測試(哪些應該被刪除)?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我的應用程序有一個由CDI應用程序作用域Bean組成的服務層:

@ApplicationScoped
@Transactional
public class PostService {
    @Inject private PostRepository postRepo;
    @Inject private UserRepository userRepo;
    @Inject private SectionRepository sectionRepo;
    @Inject private LoggedInUser loggedInUser;

    public PostDto getPost(@PostExists int id){
        Post p = postRepo.findById(id);
        //create post DTO from p
        return post;
    }

    public void delete(@PostExists int id){
        postRepo.remove(postRepo.findById(id));
    }

    public int newPost(@NotBlank @Max(255) String title,
                       @Max(2000) String body,
                       @SectionExists String sectionName){
        User user = userRepo.getByName(loggedInUser.getUsername());
        Section section = sectionRepo.getByName(sectionName);

        Post post = new Post();
        post.setTitle(title);
        post.setContent(body == null || body.isBlank() ? "" : body);
        post.setAuthor(user);
        post.setSection(section);
        post.setType(TEXT);

        return postRepo.insert(post).getId();
    }

} 

當一個方法被調用時,攔截器(在我的例子中是來自ApacheBVal的BValInterceptor.class)通過檢查注釋并相應地驗證參數來檢查該方法契約是否被遵守。

如您所見,有一些可能命中數據庫的自定義約束,如@SectionExists@PostExists

public class SectionExistsValidator implements ConstraintValidator<SectionExists, String> {
    @Inject SectionRepository sectionRepo;

    @Override
    public void initialize(SectionExists constraintAnnotation) {}

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return (sectionRepo.getByName(value) != null);
    }
}



public class PostExistsValidator implements ConstraintValidator<PostExists, Integer> {
    @Inject PostRepository postRepo;

    @Override
    public void initialize(PostExists constraintAnnotation) {}

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return (postRepo.findById(value) != null);
    }
}

我想做的是對我的業務方法(getpostdeletenewPost)和它的驗證器一起進行單元測試。應該模擬可能命中數據庫的驗證器(或者應該模擬它們的依賴項)。

我如何才能做到這一點?如何才能使注入(和模擬注入)在單元測試中對驗證器起作用?

以下是我使用的內容:

Tomee 8.0.8
用于Bean驗證的Apache BVal JSR 303/JSR380(包括在Tomee中)
用于CDI的Apache OpenWebBeans(包括在Tomee中)
JUnit5
Mockito

我可以使用OpenEJB’s ApplicationComposer或Arquillian運行嵌入式容器。但是,我從未使用過Arquillian。

cdi

最終我選擇了this really cool library (cdimock),這正是我所需要的:將推薦答案放在一個定制的cdi作用域中,這樣相同的模擬實例就可以注入到測試用例中的其他Bean中。這樣的事情也可以通過cdi-unit@Produces @Mock注釋來實現(盡管我沒有親自嘗試過,因為它只支持Weld)

這是我的測試類的代碼:

@RunWithApplicationComposer(mode = ExtensionMode.PER_EACH)
@ExtendWith({MockitoExtension.class, CdiMocking.class})
@MockitoSettings(strictness = LENIENT)
@Classes(cdi = true,
         value={PostService.class},
         cdiInterceptors = BValInterceptor.class,
         cdiStereotypes = CdiMock.class)
public class PostServiceTest {

    @Mock SectionRepository sectionRepository;
    @Mock PostRepository postRepository;
    @Mock UserRepository userRepository;
    @Inject PostService service;   

    @BeforeEach
    void setUp() {}

    @AfterEach
    void tearDown() {}

    @Test
    public void noSectionFoundNewPost(){
        String sectionName = "idontexist";
        when(sectionRepository.getByName(sectionName)).thenReturn(null);
        assertThrows(ConstraintViolationException.class,
                () -> service.newPost("title", "body", sectionName));
    }
}

在代碼中,我使用的是OpenEJB的應用程序編寫器,但我可以輕松切換到任何嵌入式CDI容器

這篇關于如何與其約束驗證器一起對方法進行單元測試(哪些應該被刪除)?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標簽:刪除 單元測試 方法 約束 驗證
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定