জুনিয়তে একাধিক রানওথের বিবৃতি


113

আমি ইউনিট পরীক্ষা লিখি JUnitParamsRunnerএবং MockitoJUnitRunnerব্যবহার করতে এবং একটি পরীক্ষার ক্লাসের জন্য চাই ।

দুর্ভাগ্যক্রমে, নিম্নলিখিতগুলি কাজ করে না:

@RunWith(MockitoJUnitRunner.class)
@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {
  // some tests
}

মকিতো এবং জুনিটপ্যারাম উভয়ই একটি পরীক্ষার ক্লাসে ব্যবহার করার কোনও উপায় আছে?



2
এখানেও একটি চমৎকার উদাহরণ রয়েছে: blog.project13.pl/index.php/coding/1077/…
ফালসারেলা

উত্তর:


110

আপনি এটি করতে পারবেন না কারণ অনুমান অনুসারে আপনি একই টীকাগুলি একই বারে একই টীকাগুলি দু'বার রাখতে পারবেন না।

তাহলে সমাধান কি? সমাধানটি হ'ল @RunWith()রানারকে কেবল একটির সাথে রাখলে আপনি ছাড়া দাঁড়াতে পারবেন না এবং অন্যটিকে অন্য কিছু দিয়ে প্রতিস্থাপন করতে পারেন। আপনার ক্ষেত্রে আমি অনুমান করি আপনি এটি মুছে MockitoJUnitRunnerফেলবেন এবং প্রোগ্রাম্যাটিকভাবে এটি করবেন do

বাস্তবে এটি চালিত একমাত্র জিনিস:

MockitoAnnotations.initMocks(test);

পরীক্ষার ক্ষেত্রে শুরুর দিকে। সুতরাং, সহজ সমাধানটি এই কোডটি setUp()পদ্ধতিতে রাখা:

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

আমি নিশ্চিত নই, তবে সম্ভবত পতাকা ব্যবহার করে আপনার এই পদ্ধতির একাধিক কল এড়ানো উচিত:

private boolean mockInitialized = false;
@Before
public void setUp() {
    if (!mockInitialized) {
        MockitoAnnotations.initMocks(this);
        mockInitialized = true;  
    }
}

তবে আরও ভাল, পুনরায় ব্যবহারযোগ্য সমাধান JUnt এর নিয়মগুলির সাথে প্রয়োগ করা যেতে পারে।

public class MockitoRule extends TestWatcher {
    private boolean mockInitialized = false;

    @Override
    protected void starting(Description d) {
        if (!mockInitialized) {
            MockitoAnnotations.initMocks(this);
            mockInitialized = true;  
        }
    }
}

এখন কেবল আপনার পরীক্ষার শ্রেণিতে নিম্নলিখিত লাইনটি যুক্ত করুন:

@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();

এবং আপনি যে কোনও রানারের সাথে এই পরীক্ষাটি চালাতে পারেন run


12
জন্য চেক mockInitializedভুল। আপনি প্রতিটি টেস্টটির জন্য একটি নতুন ব্যঙ্গ করতে চান।
বিটা রাইড

1
@ বেটা রাইড, এটি আপনার প্রয়োজনের উপর নির্ভর করে। কখনও কখনও আপনি প্রতিবার মক শুরু করতে চান, কখনও কখনও না।
অ্যালেক্সআর

আপনি যদি প্রতি ক্লাস ফাইল একবারে সেট আপ করতে চান তবে আপনি পূর্বের পরিবর্তে পূর্বক্লাস ব্যবহার করতে পারেন, যা পরীক্ষার ফাইলের জন্য একবার এবং কেবল একবার ডাকা হবে।
ইনফার্নাল র্যাপচার

56

JUnit 4.7 এবং মোকিটো 1.10.17 হিসাবে, এই কার্যকারিতাটি অন্তর্নির্মিত; একটি org.mockito.junit.MockitoRuleক্লাস আছে। আপনি কেবল এটিকে আমদানি করতে এবং লাইনটি যুক্ত করতে পারেন

@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();

আপনার পরীক্ষা ক্লাস।


2
মকিতোর পুরানো সংস্করণগুলির জন্য (এটি মনে হয় 1.10.5 এর নিচে নেমে গেছে), আপনাকে ব্যবহার করতে হবে:@Rule public MockitoJUnitRule mockito = new MockitoJUnitRule(this);
ক্লিফ সান

MockitoAnnotations.initMocks(this)উপহাস তৈরি করতে খুব ধীর। সবচেয়ে কার্যকর উপায় হ'ল @ রুনভিথ (মকিতোজুনিটরুনার.ক্লাস) ব্যবহার করুন
ant2009

16

এই সমাধানটি কেবল এই মকিতো উদাহরণ নয়, প্রতিটি সম্ভাব্য রানারের পক্ষে কাজ করে। উদাহরণ স্বরূপ; বসন্তের জন্য, কেবল রানার ক্লাসগুলি পরিবর্তন করুন এবং প্রয়োজনীয় টীকা যুক্ত করুন।

@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {

    @Test
    public void subRunner() throws Exception {
        JUnitCore.runClasses(TestMockitoJUnitRunner.class);
    }

    @RunWith(MockitoJUnitRunner.class)
    public static class TestMockitoJUnitRunner {
    }
}

DatabaseModelTestজুনিট দ্বারা পরিচালিত হবে। TestMockitoJUnitRunnerএটির উপর নির্ভর করে (যুক্তি দিয়ে) এবং এটি কল করার সময় কোনও পদ্ধতিতে মূলটির অভ্যন্তরে চালিত হবে । এই পদ্ধতিটি নিশ্চিত করে যে সাব রানার চালানোর আগে প্রধান রানার সঠিকভাবে শুরু হয়েছিল , নির্ভরশীল টেস্ট ক্লাসগুলির সাথে একাধিক নেস্টেড টিকাটি কার্যকরভাবে কার্যকর করে ।@TestJUnitCore.runClasses(TestMockitoJUnitRunner.class)static class TestMockitoJUnitRunner@RunWith

এছাড়াও https://bekce.github.io/ জুনit-m Multipleple-runwith-d dependent-tests এ


3
JUnitCore.runClasses()ফলাফলটি পরীক্ষা না করে কল করে , আপনি অভ্যন্তরীণ পরীক্ষা থেকে ত্রুটিগুলি মুখোশের ঝুঁকিপূর্ণ করেন। assert(JUnitCore.runClasses(TestMockitoJUnitRunner.class).wasSuccessful());কমপক্ষে আপনাকে ত্রুটিটি রিপোর্ট করবে
রোবটনিক

8

পাওয়ারমক 1.6 প্রকাশের পরে, আপনি এটি হিসাবে সহজেই করতে পারেন

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(JUnitParamsRunner.class)
public class DatabaseModelTest {
  // some tests
}

এখানে https://blog.jayway.com/2014/11/29/using-another- জুনit-runner-with-powermock/- এর ব্যাখ্যা দেওয়া হয়েছে


2

আমার ক্ষেত্রে আমি বসন্ত শিম এবং কিছু পদ্ধতিতে উপহাস করার চেষ্টা করছিলাম

MockitoAnnotations.initMocks(test);

কাজ করে না পরিবর্তে আপনাকে নীচের মত আপনার এক্সএমএল ফাইলের মধ্যে মোক ব্যবহার করে নির্মিত সেই শিমটি নির্ধারণ করতে হবে।

...
<bean id="classWantedToBeMocked" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.fullpath.ClassWantedToBeMocked" />
</bean>
...

এবং নীচের মতো আপনার পরীক্ষার শ্রেণীর অভ্যন্তরে স্বশক্তির সাথে সেই শিমটি যুক্ত করুন।

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="file:springconfig.xml")
public class TestClass {
    ...
    @Autowired
    private ClassWantedToBeMocked classWantedToBeMocked;
    ...
    when(classWantedToBeMocked.methodWantedToBeMocked()).thenReturn(...);
    ...
}

0

এই লিঙ্কটি দেখুন https://bekce.github.io/ জুনit-mલ્ટple-runwith-d dependent-tests/ এই পদ্ধতির সাহায্যে আমি একটি @ রুনউইথ (প্যারামিটারাইজড.ক্লাস) - বহিরাগত রানার - @ রুনউইথ (মকিতোজেউনিতরুনার.ক্লাস) - এর সাথে সংযুক্ত করেছি - অভ্যন্তর রানার। আমার কেবলমাত্র ত্বকটি যোগ করার ছিল আভ্যন্তরীণ / নেস্টেড রানার / ক্লাসের জন্য তাদের অ্যাক্সেসযোগ্য করার জন্য বাইরের শ্রেণি / রানারকে স্থিতিশীলভাবে আমার সদস্য ভেরিয়েবলগুলি তৈরি করা। ভাগ্য এবং উপভোগ।


0

আমি SWTBotJunit4ClassRunner এবং org.junit.runners.Parameterized চালাতে চেয়েছিলাম , আমার প্যারামেট্রিক পরীক্ষা আছে এবং এসডাব্লুটি পরীক্ষায় ব্যর্থ হওয়ার পরে আমি স্ক্রিনশট নিতে চাই (স্ক্রিনশট বৈশিষ্ট্যটি এসডাব্লুবটজুনিট 4 ক্লাসরনারের দ্বারা সরবরাহ করা হয় )। @ বেকসের উত্তরটি দুর্দান্ত এবং প্রথমে সেই পথে যেতে চেয়েছিল তবে এটি হয় আর্গুমেন্টের মধ্য দিয়ে যাচ্ছিল। অথবা সাবক্লাসে প্যারামেট্রাইজড করা এবং সঠিক পরীক্ষাগুলি কীভাবে পাস / ব্যর্থ হয়েছে এবং কেবলমাত্র শেষ স্ক্রিনশট রয়েছে (যেমন স্ক্রিনশটের নামগুলি পরীক্ষা থেকে নিজের নামটি পেয়েছে) তথ্যটি হারিয়ে ফেলে। সুতরাং উভয় উপায় এটি কিছুটা অগোছালো ছিল।

আমার ক্ষেত্রে এসডাব্লুটিবটজুনিট 4 ক্লাসরুনার যথেষ্ট সহজ, তাই আমি ক্লাসের উত্স-কোডটি ক্লোন করেছি, এটি আমার নিজের নাম প্যারামেট্রাইজডস্ক্রিনশট রুনার দিয়েছি এবং যেখানে মূল টেস্টরুনারটি প্রসারিত করছিল , আমার ক্লাসটি প্যারামিটারাইজড ক্লাসটি প্রসারিত করছে যাতে সংক্ষেপে আমি নিজের রানারটি ব্যবহার করতে পারি আগের দুটি পরিবর্তে। সিদ্ধ হওয়া আমার নিজের রানার উপরে পর্দাটি বৈশিষ্ট্যটি প্রয়োগ করার সময় প্যারামিটারাইজড রানারের শীর্ষে প্রসারিত হয়, এখন আমার পরীক্ষাটি এই "হাইব্রিড" রানার ব্যবহার করে এবং সমস্ত পরীক্ষাগুলি সরাসরি প্রত্যাশা অনুযায়ী কাজ করে (পরীক্ষার অভ্যন্তরে কোনও পরিবর্তন করার দরকার নেই)।

এটি দেখতে কেমন লাগে (বংশবৃদ্ধির জন্য আমি সমস্ত মন্তব্য তালিকা থেকে সরিয়ে নিয়েছি):

package mySwtTests;

import org.junit.runners.Parameterized;
import org.eclipse.swtbot.swt.finder.junit.ScreenshotCaptureListener;
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;

public class ParametrizedScreenshotRunner extends TestRu Parameterized {

    public ParametrizedScreenshotRunner(Class<?> klass) throws Throwable {
        super(klass);
    }

    public void run(RunNotifier notifier) {
        RunListener failureSpy = new ScreenshotCaptureListener();
        notifier.removeListener(failureSpy); // remove existing listeners that could be added by suite or class runners
        notifier.addListener(failureSpy);
        try {
            super.run(notifier);
        } finally {
            notifier.removeListener(failureSpy);
        }
    }
}

-15

আপনি এটি ব্যবহার করে দেখতে পারেন:

@RunWith(JUnitParamsRunner.class)
public class AbstractTestClass {
  // some tests
}

@RunWith(MockitoJUnitRunner.class)
public class DatabaseModelTest extends AbstractTestClass {
  // some tests
}

2
এটি কাজ করবে না, কেবলমাত্র উপ-শ্রেণীর টিকাটি প্রক্রিয়া করা হবে।
PaulNUK

না কী ভাবে কাজ করে - শুধুমাত্র MockitoJUnitRunner টীকা বিবেচনায় নেয়া হবে
Przemek Bielicki
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.