2016-02-22 13 views
7

में लॉग संदेश एंड्रॉइड स्टूडियो में JUnit (विधि) परीक्षण चलाते समय Logcat (Log.i, Log.d) संदेशों को मुद्रित करने का कोई तरीका है?एंड्रॉइड स्टूडियो जूनिट परीक्षण

मैं System.out.print संदेश देख सकता हूं लेकिन कोई लॉगकैट प्रिंटआउट नहीं देख सकता।

रन कॉन्फ़िगरेशन (एंड्रॉइड स्टूडियो की जीयूआई विंडो) में एंड्रॉइड परीक्षणों के तहत परीक्षणों के लिए लॉगकैट विकल्प हैं लेकिन जुनीट परीक्षणों के लिए नहीं।

क्या यह किसी भी तरह से संभव है? किसी भी संकेत के लिए धन्यवाद!

+0

क्या आपको पता चला कि यह कैसे करना है? मुझे अब एक ही प्रश्न का सामना करना पड़ रहा है ... –

+1

@ इगोरगानापोलस्की, आप – Vasiliy

उत्तर

0

मैं वही चीज़ खोज रहा था और कभी भी सीधा जवाब नहीं मिला। मुझे पता है कि यह प्रश्न एक साल पुराना है लेकिन फिर भी, भविष्य के संदर्भ के लिए यहां जवाब देना अच्छा होगा।

Android.util.Log क्लास सीधे लॉगकैट पर लॉग ऑन करता है और स्थानीय JVM पर यूनिट परीक्षण चलाते समय android.util.Log के लिए कार्यान्वयन उपलब्ध नहीं होता है। आपके यूनिट परीक्षणों में लॉग क्लास का उपयोग करने का प्रयास करते समय आपको एक त्रुटि प्राप्त होगी क्योंकि "यूनिट परीक्षण चलाने के लिए उपयोग की जाने वाली android.jar फ़ाइल में कोई वास्तविक कोड नहीं होता है (वे एपीआई केवल डिवाइस पर एंड्रॉइड सिस्टम छवि द्वारा प्रदान की जाती हैं) । "
See Android Documentation on Unit Testing

तो तुम सच में android.util.Log उपयोग करना चाहते हैं यदि आप इसे स्थानीय स्तर पर नकली और कंसोल के लिए मुद्रित करने के लिए System.out.print का उपयोग करने की आवश्यकता होगी। शुरू करने के लिए, अपनी परियोजना में PowerMockito जोड़ें। आप Gradle उपयोग कर रहे हैं, तो आप सिर्फ निम्नलिखित निर्भरता जोड़ सकते हैं:

testCompile 'junit:junit:4.12' 
testCompile 'org.powermock:powermock:1.6.5' 
testCompile 'org.powermock:powermock-module-junit4:1.6.5' 
testCompile 'org.powermock:powermock-api-mockito:1.6.5' 

अगला मैं स्टीव का जवाब here इस्तेमाल किया यह पता लगाने की कैसे एक पैरामीटर Mockito का उपयोग कर एक नकली वस्तु में पारित कर दिया लौटने के लिए।

import android.util.Log; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.invocation.InvocationOnMock; 
import org.mockito.stubbing.Answer; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

import static org.mockito.Matchers.anyString; 
import static org.powermock.api.mockito.PowerMockito.when; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Log.class}) 
public class SomeUnitTest { 

    @Test 
    public void testSomething() { 
     System.out.println("Running test"); 
     PowerMockito.mockStatic(Log.class); 

     // Log warnings to the console   
     when(Log.w(anyString(), anyString())).thenAnswer(new Answer<Void>()  { 
      @Override 
      public Void answer(InvocationOnMock invocation) throws Throwable { 
       Object[] args = invocation.getArguments(); 
       if (args.length > 1) { //cause I'm paranoid 
        System.out.println("Tag:" + args[0] + " Msg: " + args[1]); 
       } 
       return null; 
      } 
     }); 
     Log.w("My Tag", "This is a warning"); 
    } 
} 

आशा इस कोई मदद करता है:

परिणाम की तरह कुछ था!

+0

से नीचे अपना उत्तर देख सकते हैं, मैं हर कीमत पर पावरमैक से बचने के लिए सुझाव दूंगा और इच्छित व्यवहार – Vasiliy

+0

प्राप्त करने के लिए मानक ओओपी प्रथाओं का उपयोग करूंगा "मैं सुझाव दूंगा पावरमैक हर कीमत पर "- ठीक है, आप कैसे समझाते हैं? – user3474985

+0

जैसा कि मैंने कहा था: वांछित व्यवहार प्राप्त करने के लिए मानक ओओपी प्रथाओं का उपयोग करें "। बाइटकोड में "हैकिंग" एक साधारण समाधान की तरह प्रतीत हो सकता है, लेकिन यह नहीं है, और यह पथ बहुत मैला है। इसे ठीक से कैसे करें इस बारे में विवरण के लिए मेरा उत्तर – Vasiliy

3

लॉगक आउटपुट यूनिट परीक्षणों में नहीं देखा जाएगा क्योंकि लॉगकैट एंड्रॉइड फीचर है - जुनीट परीक्षण केवल मानक जावा का उपयोग कर सकते हैं, इसलिए एंड्रॉइड फीचर्स काम नहीं करेंगे।

यूनिट परीक्षणों में आप क्या कर सकते हैं परीक्षण घटकों में "परीक्षण युगल" इंजेक्ट किया जाता है। लेकिन 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 के साथ सभी परीक्षण चलाते हैं, तो यह केवल अक्षम है, लेकिन यदि सभी एंड्रॉइड कॉल डिफ़ॉल्ट मान लौटाते हैं, तो आप परीक्षण सूट विश्वसनीय नहीं हैं। मेरा सुझाव है कि आप आगे बढ़ने से पहले इस मुद्दे को ठीक करें क्योंकि यह आपको भविष्य में एक या दूसरे तरीके से काट देगा।

+0

देखें, आप एमएलओगर के बजाए अपने लॉगर इंस्टेंस लॉग का नाम देकर बस अपनी लॉग कॉल को बदलने की आवश्यकता से बच सकते हैं। – JulianSymes

संबंधित मुद्दे