@ মক, @ মকবিয়ান এবং মকিতো.মক () এর মধ্যে পার্থক্য


147

পরীক্ষাগুলি এবং উপহাস নির্ভরতা তৈরি করার সময়, এই তিনটি পদ্ধতির মধ্যে পার্থক্য কী?

  1. @MockBean:

    @MockBean
    MyService myservice;
    
  2. @উপহাস:

    @Mock
    MyService myservice;
    
  3. Mockito.mock ()

    MyService myservice = Mockito.mock(MyService.class);

উত্তর:


198

সরল মকিতো গ্রন্থাগার

import org.mockito.Mock;
...
@Mock
MyService myservice;

এবং

import org.mockito.Mockito;
...
MyService myservice = Mockito.mock(MyService.class);

মকিতো গ্রন্থাগার থেকে আসা এবং কার্যত সমতুল্য।
তারা কোনও শ্রেণি বা একটি ইন্টারফেসকে বিদ্রূপ করার এবং এটিতে আচরণ রেকর্ড এবং যাচাই করার অনুমতি দেয়।

টীকাটি ব্যবহারের উপায়টি ছোট, তাই বেশি পছন্দনীয় এবং প্রায়শই পছন্দনীয়।


নোট করুন যে পরীক্ষার মৃত্যুদণ্ডের সময় মকিতো টিকাগুলি সক্ষম করতে, MockitoAnnotations.initMocks(this)স্থির পদ্ধতিটি কল করতে হবে।
পরীক্ষার মধ্যে পার্শ্ব প্রতিক্রিয়া এড়াতে, প্রতিটি পরীক্ষার মৃত্যুর আগে এটি করার পরামর্শ দেওয়া হয়:

@Before 
public void initMocks() {
    MockitoAnnotations.initMocks(this);
}

মকিতো টীকাগুলি সক্ষম করার আরেকটি উপায় হ'ল পরীক্ষাটি ক্লাসটি বেনিফিট @RunWithকরে MockitoJUnitRunnerযা এই কাজটি করে এবং অন্যান্য দরকারী জিনিসগুলি নির্দিষ্ট করে:

@RunWith(org.mockito.runners.MockitoJUnitRunner.class)
public MyClassTest{...}

মকিতো লাইব্রেরি মোড়ানো স্প্রিং বুট গ্রন্থাগার

এটি প্রকৃতপক্ষে একটি স্প্রিং বুট শ্রেণি :

import org.springframework.boot.test.mock.mockito.MockBean;
...
@MockBean
MyService myservice;

ক্লাসটি spring-boot-testলাইব্রেরিতে অন্তর্ভুক্ত রয়েছে ।

এটি একটি বসন্তে মকিতো মোককে যোগ করতে দেয় ApplicationContext
যদি কোনও শিম, ঘোষিত শ্রেণীর সাথে সামঞ্জস্যপূর্ণ প্রসঙ্গে উপস্থিত থাকে, তবে এটি এটি মক দ্বারা প্রতিস্থাপন করে।
যদি তা হয় না, এটা যোগ করা একটি শিম যেমন প্রেক্ষাপটে উপহাস।

জাভাডোক রেফারেন্স:

একটি স্প্রিং অ্যাপ্লিকেশন কনটেক্সটে মক যোগ করতে ব্যবহৃত টীকা।

...

প্রসঙ্গে বর্ণিত একই ধরণের যে কোনও বিদ্যমান একক শিমটি মক দ্বারা প্রতিস্থাপন করা হবে, যদি কোনও বিদ্যমান শিমের সংজ্ঞা না দেওয়া হয় তবে একটি নতুন যুক্ত করা হবে।


ক্লাসিক / প্লেইন মকিতো কখন এবং @MockBeanস্প্রিং বুট থেকে ব্যবহার করবেন ?

ইউনিট পরীক্ষাগুলি অন্য উপাদানগুলি থেকে বিচ্ছিন্ন করার জন্য একটি উপাদান পরীক্ষা করার জন্য ডিজাইন করা হয়েছে এবং ইউনিট পরীক্ষাগুলিরও একটি প্রয়োজনীয়তা রয়েছে: এই পরীক্ষাগুলি বিকাশকারী মেশিনগুলিতে প্রতিদিন ডজনবার কার্যকর করা যেতে পারে কার্যকরকরণের সময় হিসাবে যত দ্রুত সম্ভব being

ফলস্বরূপ, এখানে একটি সহজ গাইডলাইন:

আপনি যেমন একটি পরীক্ষা লিখেন যার জন্য স্প্রিং বুট ধারকটির কোনও নির্ভরতার প্রয়োজন নেই, ক্লাসিক / প্লেইন মকিতো হ'ল অনুসরণ করার উপায়: এটি দ্রুত এবং পরীক্ষিত উপাদানটি বিচ্ছিন্ন করার পক্ষে।
যদি আপনার পরীক্ষার জন্য স্প্রিং বুট ধারকটির উপর নির্ভর করতে হয় এবং আপনি কোনও ধারক মটরশুটি যোগ করতে বা উপহাস করতে চান: @MockBeanস্প্রিং বুট থেকে উপায়।


স্প্রিং বুটের সাধারণ ব্যবহার @MockBean

আমরা যেমন @WebMvcTest(ওয়েব পরীক্ষার স্লাইস) দিয়ে টীকায়িত একটি পরীক্ষার শ্রেণি লিখি ।

স্প্রিং বুট ডকুমেন্টেশনগুলি খুব ভালভাবে সংক্ষিপ্তসার করে:

প্রায়শই @WebMvcTestএকক নিয়ামকের মধ্যে সীমাবদ্ধ থাকে এবং @MockBeanপ্রয়োজনীয় সহযোগীদের জন্য মক বাস্তবায়ন সরবরাহের জন্য একত্রে ব্যবহৃত হয় ।

এখানে একটি উদাহরণ:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@RunWith(SpringRunner.class)
@WebMvcTest(FooController.class)
public class FooControllerTest {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private FooService fooServiceMock;

    @Test
    public void testExample() throws Exception {
         Foo mockedFoo = new Foo("one", "two");

         Mockito.when(fooServiceMock.get(1))
                .thenReturn(mockedFoo);

         mvc.perform(get("foos/1")
            .accept(MediaType.TEXT_PLAIN))
            .andExpect(status().isOk())
            .andExpect(content().string("one two"));
    }

}

4
@ মকবিয়ান ব্যবহার করে শিমের একটি অনুলিপি তৈরি করে এপ্লিকেশনকন্টেক্সে ইনজেকশন দেবে? অথবা বিদ্রূপিত শিমের সমস্ত পদ্ধতি বাতিল হয়ে যাবে? সমস্ত পদ্ধতি যদি নাল হয় তবে আমি কীভাবে @ মক ব্যবহার করে করতে পারি সেগুলিতে আমি তাদের আটকাতে পারি?
ডগ

6
যেমন @MockBeanবর্ণিত হয়েছে, একই ধরণের ঘোষিত শিম আপনার স্প্রিং কনফিগারেশনে ইতিমধ্যে সংজ্ঞায়িত করা থাকলে অ্যাপ্লিকেশন প্রসঙ্গে শিমটি ব্যবহার করে প্রতিস্থাপন করা হবে। এবং ইঞ্জিনটি ক্লাসে সঞ্চালিত হয় যেখানে আপনি ঘোষণা করেন @MockBean.যে ডিআই মেকানিজমগুলি এইভাবে কাজ করে: আপনি ডিআই প্রসঙ্গে একটি বিষয় নিবন্ধভুক্ত করেন এবং তারপরে আপনি কোনও নির্দিষ্ট শ্রেণিতে বসন্তের প্রসঙ্গে রেফারেন্স করা বস্তুকে ইনজেক্ট করতে পারেন। আপনি ডিআই প্রসঙ্গে কোনও বস্তু ইনজেক্ট করবেন না।
ডেভিডএক্সএক্সএক্স

13

শেষে এটি ব্যাখ্যা করা সহজ। আপনি যদি টীকাগুলির জাভাদোকগুলি সন্ধান করেন তবে আপনি ভিন্নতা দেখতে পাবেন:

@ মোক: ( org.mockito.Mock)

একটি ক্ষেতটিকে একটি উপহাস হিসাবে চিহ্নিত করুন।

  • শর্টহ্যান্ড মক তৈরির অনুমতি দেয়।
  • পুনরাবৃত্তিমূলক মেক তৈরির কোডটি ন্যূনতম করে।
  • পরীক্ষার শ্রেণিকে আরও পাঠযোগ্য করে তোলে।
  • পাঠটি যাচাইকরণ ত্রুটিটিকে আরও সহজ করে তোলে কারণ ক্ষেত্রের নামটি মক শনাক্ত করতে ব্যবহৃত হয়।

@ মকবিয়ান: ( org.springframework.boot.test.mock.mockito.MockBean)

একটি স্প্রিং অ্যাপ্লিকেশন কনটেক্সটে মক যোগ করতে ব্যবহৃত টীকা। ক্লাস লেভেল টীকা হিসাবে ব্যবহার করা যেতে পারে বা উভয় @Configurationশ্রেণিতে ক্ষেত্রগুলিতে , বা @RunWithস্প্রিংআরনার যা পরীক্ষা ক্লাস ।

মকস টাইপ বা শিমের নাম দ্বারা নিবন্ধিত হতে পারে। প্রসঙ্গে নির্ধারিত একই ধরণের যে কোনও বিদ্যমান একক শিমটি মক দ্বারা প্রতিস্থাপন করা হবে, যদি কোনও বিদ্যমান শিমের সংজ্ঞা না দেওয়া হয় তবে একটি নতুন যুক্ত করা হবে।

@MockBeanক্ষেত্রটিতে কখন ব্যবহৃত হয়, পাশাপাশি অ্যাপ্লিকেশন প্রসঙ্গে নিবন্ধভুক্ত হওয়ার পরে, মোকটি ক্ষেত্রের মধ্যেও ইনজেকশনের ব্যবস্থা করা হবে।

Mockito.mock ()

এটি কেবল একটি প্রতিনিধিত্ব @Mock


5
আসুন ভুলে যাবেন না যে @ মকটির জন্য মকিতোআর্নার বা ইনিমকসকে ম্যানুয়ালি কল করা দরকার।
ফ্লোরিয়ান স্কায়েটজ 26'17

4
এর মধ্যে পার্থক্য কী @MockBeanএবং @Mockএটি একটিতে মক ইনজেকশন দেবে Spring ApplicationContextএবং অন্যটি করবে না?
ডগ

3
@ ডাওগ আপনি এটির সংক্ষিপ্তসারটি লিখেছেন তবে একটি মনে রাখা দরকার যে মকবিয়ান স্প্রিং বুটের অংশ
কমিভেন্টর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.