যদি আপনাকে কেবল কোনও বিমূর্তে স্পর্শ না করে কয়েকটি কংক্রিটের পদ্ধতি পরীক্ষা করতে হয় তবে আপনি এটি ব্যবহার করতে পারেন CALLS_REAL_METHODS
( মর্টেনের উত্তর দেখুন ), তবে পরীক্ষার অধীনে কংক্রিট পদ্ধতিটি যদি কিছু বিমূর্তি বা প্রয়োগ না করা ইন্টারফেস পদ্ধতিতে কল করে তবে এটি কার্যকর হবে না this - মকিতো অভিযোগ করবে "জাভা ইন্টারফেসে আসল পদ্ধতিতে কল করা যায় না।"
(হ্যাঁ, এটি একটি স্বল্প নকশাকৃত নকশা, তবে কিছু ফ্রেমওয়ার্ক, উদাহরণস্বরূপ টেপস্ট্রি 4, এটিকে আপনার উপর চাপ দিন)
কাজটি হ'ল এই পদ্ধতির বিপরীত হওয়া - সাধারণ উপহাস আচরণ (যেমন, সমস্ত কিছু উপহাস / স্ট্যাবড) ব্যবহার করুন doCallRealMethod()
এবং পরীক্ষার অধীনে কংক্রিট পদ্ধতিটি স্পষ্টভাবে কল করতে ব্যবহার করুন । যেমন
public abstract class MyClass {
@SomeDependencyInjectionOrSomething
public abstract MyDependency getDependency();
public void myMethod() {
MyDependency dep = getDependency();
dep.doSomething();
}
}
public class MyClassTest {
@Test
public void myMethodDoesSomethingWithDependency() {
MyDependency theDependency = mock(MyDependency.class);
MyClass myInstance = mock(MyClass.class);
// can't do this with CALLS_REAL_METHODS
when(myInstance.getDependency()).thenReturn(theDependency);
doCallRealMethod().when(myInstance).myMethod();
myInstance.myMethod();
verify(theDependency, times(1)).doSomething();
}
}
যোগ করার জন্য আপডেট হয়েছে:
অকার্যকর পদ্ধতির জন্য, আপনাকে thenCallRealMethod()
পরিবর্তে ব্যবহার করতে হবে, যেমন:
when(myInstance.myNonVoidMethod(someArgument)).thenCallRealMethod();
অন্যথায় মকিতো অভিযোগ করবে "অসম্পূর্ণ স্টাব সনাক্ত হয়েছে।"
SomeAbstract spy = spy(SomeAbstract.class);