लॉगक आउटपुट यूनिट परीक्षणों में नहीं देखा जाएगा क्योंकि लॉगकैट एंड्रॉइड फीचर है - जुनीट परीक्षण केवल मानक जावा का उपयोग कर सकते हैं, इसलिए एंड्रॉइड फीचर्स काम नहीं करेंगे।
यूनिट परीक्षणों में आप क्या कर सकते हैं परीक्षण घटकों में "परीक्षण युगल" इंजेक्ट किया जाता है। लेकिन Log.x
कॉल स्थिर हैं, इसलिए आप उन्हें ओवरराइड नहीं कर सकते हैं (उदाहरण के लिए PowerMock को हल किए बिना, जिसे आपको हर कीमत से बचना चाहिए)।
/**
* This class is a non-static logger
*/
public class Logger {
public void e(String tag, String message) {
Log.e(tag, message);
}
public void w(String tag, String message) {
Log.w(tag, message);
}
public void v(String tag, String message) {
Log.v(tag, message);
}
public void d(String tag, String message) {
Log.d(tag, message);
}
}
हर जगह में इस वर्ग का प्रयोग करें आप Log.x
कॉल अब है:
इसलिए, पहला कदम एक गैर स्थैतिक कक्षा कि Log.x
कॉल के लिए एक प्रॉक्सी के रूप में व्यवहार करेंगे लागू करने के लिए किया जाएगा।
दूसरा कदम Logger
का एक परीक्षण-डबल कार्यान्वयन कि मानक आउटपुट पर रीडायरेक्ट लिखने के लिए होगा:
public class UnitTestLogger extends Logger{
@Override
public void e(String tag, String message) {
System.out.println("E " + tag + ": " + message);
}
// similar for other methods
}
अंतिम चरण इकाई परीक्षण में UnitTestLogger
बजाय Logger
इंजेक्षन करने के लिए है:
@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest {
private Logger mLogger = new UnitTestLogger();
private SomeClass SUT;
@Before
public void setup() throws Exception {
SUT = new SomeClass(/* other dependencies here */ mLogger);
}
}
यदि आप ओओपी अवधारणाओं के बारे में कठोर सख्त होना चाहते हैं, तो आप Logger
और UnitTestLogger
के लिए सामान्य इंटरफ़ेस निकाल सकते हैं।
उस ने कहा, मुझे इकाई परीक्षणों में Log.x
कॉल की जांच करने की आवश्यकता का सामना नहीं करना पड़ा। मुझे संदेह है कि आपको इसकी आवश्यकता नहीं है। आप डिबग मोड में इकाई परीक्षण चलाने के लिए और कोड पर कदम पंक्ति-दर-पंक्ति डिबगर, जो logcat उत्पादन की जांच करने के लिए प्रयास की तुलना में बहुत तेजी से होता है में कर सकते हैं ...
जनरल सलाह:
कोड हैं आप परीक्षण कर रहे हैं Log.x
स्थैतिक कॉल और आपके यूनिट परीक्षण क्रैश नहीं होते - आपको कोई समस्या है।
मुझे लगता है कि या तो सभी परीक्षण Robolectric
के साथ चल रहे हैं, या आपके पास build.gradle: unitTests.returnDefaultValues = true
में यह कथन है।
यदि आप Robolectric
के साथ सभी परीक्षण चलाते हैं, तो यह केवल अक्षम है, लेकिन यदि सभी एंड्रॉइड कॉल डिफ़ॉल्ट मान लौटाते हैं, तो आप परीक्षण सूट विश्वसनीय नहीं हैं। मेरा सुझाव है कि आप आगे बढ़ने से पहले इस मुद्दे को ठीक करें क्योंकि यह आपको भविष्य में एक या दूसरे तरीके से काट देगा।
क्या आपको पता चला कि यह कैसे करना है? मुझे अब एक ही प्रश्न का सामना करना पड़ रहा है ... –
@ इगोरगानापोलस्की, आप – Vasiliy