মক ইনিশিয়ালেশনের জন্য , রানার ব্যবহার করে বা এটি MockitoAnnotations.initMocks
কঠোরভাবে সমতুল্য সমাধান। এর javadoc থেকে MockitoJUnitRunner :
JUnit 4.5 runner initializes mocks annotated with Mock, so that explicit usage of MockitoAnnotations.initMocks(Object) is not necessary. Mocks are initialized before each test method.
MockitoAnnotations.initMocks
যখন আপনি ইতিমধ্যে SpringJUnit4ClassRunner
আপনার পরীক্ষার ক্ষেত্রে কোনও নির্দিষ্ট রানার ( উদাহরণস্বরূপ) কনফিগার করেছেন তখন প্রথম সমাধানটি (এর সাথে ) ব্যবহার করা যেতে পারে ।
দ্বিতীয় সমাধানটি (এর সাথে MockitoJUnitRunner
) আরও ক্লাসিক এবং আমার প্রিয়। কোডটি সহজ। রানার ব্যবহারের বড় সুবিধা প্রদান করে ফ্রেমওয়ার্ক ব্যবহার স্বয়ংক্রিয় বৈধতা (বর্ণনা @David ওয়ালেস মধ্যে এই উত্তর )।
উভয় সমাধান পরীক্ষার পদ্ধতির মধ্যে মক (এবং গুপ্তচরদের) ভাগ করে নিতে দেয়। এর সাথে মিলিত হয়ে @InjectMocks
তারা খুব দ্রুত ইউনিট পরীক্ষা লেখার অনুমতি দেয়। বয়লারপ্লেট মকিং কোড হ্রাস পেয়েছে, পরীক্ষাগুলি পড়া সহজ। উদাহরণ স্বরূপ:
@RunWith(MockitoJUnitRunner.class)
public class ArticleManagerTest {
@Mock private ArticleCalculator calculator;
@Mock(name = "database") private ArticleDatabase dbMock;
@Spy private UserProvider userProvider = new ConsumerUserProvider();
@InjectMocks private ArticleManager manager;
@Test public void shouldDoSomething() {
manager.initiateArticle();
verify(database).addListener(any(ArticleListener.class));
}
@Test public void shouldDoSomethingElse() {
manager.finishArticle();
verify(database).removeListener(any(ArticleListener.class));
}
}
পেশাদাররা: কোডটি ন্যূনতম
কনস: কালো যাদু। আইএমও এটি মূলত @ ইনজেক্টমোকস টীকা দেওয়ার কারণে। এই টীকাটি দিয়ে "আপনি কোডের ব্যথাটি শিথিল করেছেন" ( @ ব্রাইসের দুর্দান্ত মন্তব্য দেখুন )
তৃতীয় সমাধানটি প্রতিটি পরীক্ষার পদ্ধতিতে আপনার মক তৈরি করা। এটি @ এম কে কে এর উত্তরে ব্যাখ্যা হিসাবে " স্বনির্ভর পরীক্ষা " করার অনুমতি দেয়।
public class ArticleManagerTest {
@Test public void shouldDoSomething() {
// given
ArticleCalculator calculator = mock(ArticleCalculator.class);
ArticleDatabase database = mock(ArticleDatabase.class);
UserProvider userProvider = spy(new ConsumerUserProvider());
ArticleManager manager = new ArticleManager(calculator,
userProvider,
database);
// when
manager.initiateArticle();
// then
verify(database).addListener(any(ArticleListener.class));
}
@Test public void shouldDoSomethingElse() {
// given
ArticleCalculator calculator = mock(ArticleCalculator.class);
ArticleDatabase database = mock(ArticleDatabase.class);
UserProvider userProvider = spy(new ConsumerUserProvider());
ArticleManager manager = new ArticleManager(calculator,
userProvider,
database);
// when
manager.finishArticle();
// then
verify(database).removeListener(any(ArticleListener.class));
}
}
পেশাদাররা: আপনার এপিআই কীভাবে কাজ করে তা আপনি স্পষ্টভাবে প্রদর্শন করেছেন (বিডিডি ...)
কনস: আরও বেশি বয়লারপ্লেট কোড রয়েছে। (বিদ্রূপ সৃষ্টি)
আমার ক্ষতিপূরণ একটি আপস। এর @Mock
সাথে টীকাটি ব্যবহার করুন @RunWith(MockitoJUnitRunner.class)
, তবে এটি ব্যবহার করবেন না @InjectMocks
:
@RunWith(MockitoJUnitRunner.class)
public class ArticleManagerTest {
@Mock private ArticleCalculator calculator;
@Mock private ArticleDatabase database;
@Spy private UserProvider userProvider = new ConsumerUserProvider();
@Test public void shouldDoSomething() {
// given
ArticleManager manager = new ArticleManager(calculator,
userProvider,
database);
// when
manager.initiateArticle();
// then
verify(database).addListener(any(ArticleListener.class));
}
@Test public void shouldDoSomethingElse() {
// given
ArticleManager manager = new ArticleManager(calculator,
userProvider,
database);
// when
manager.finishArticle();
// then
verify(database).removeListener(any(ArticleListener.class));
}
}
পেশাদাররা: আপনার এপিআই কীভাবে কাজ করে তা আপনি স্পষ্টভাবে প্রদর্শন করেছেন (আমার কীভাবে ArticleManager
তাত্ক্ষণিক হয়)। কোনও বয়লারপ্লেট কোড নেই।
কনস: পরীক্ষাটি স্ব-অন্তর্ভুক্ত নয়, কোডের কম ব্যথা