1

I've read about using a static variable from a class in the test class but I'm wondering if this is legal enough to do.

@isTest
public class myTestClass{
    public static Boolean mySwitch = false;
    public static testMethod void myTestMethod1(){
        // code //
    }
    public static testMethod void myTestMethod2(){
        mySwitch = true;
        // code //
    }
}

public class actualClass{
    public void method1(){
        if(Test.isRunningTest){
            //always true if its hitting from a test class.
        } else if(Test.isRunningTest && myTestClass.mySwitch){
            //do something from myTestMethod2
        }
    }
}
2
  • 2
    What code/why are you trying to gate in test context? That's something one generally ought to do only if one really has to and has run out of other tools, in my opinion.
    – David Reed
    Commented Apr 11, 2019 at 22:26
  • I'm sorry but can't share my code here. I can explain why am trying to do this, let's say there is an if condition which can't be made true from a test class but can be done using Test.isRunningTest() in actual class. What this does now is that, it will always get into this if condition but not the next if-else conditions. My bad if this is confusing.
    – apz
    Commented Apr 11, 2019 at 22:35

2 Answers 2

5

You cannot reference a test class from a production class. You have the pattern reversed on where the Boolean flag should be.

You should avoid code which runs only out of a test context wherever possible. There are a few exceptions, such as:

  • Disabling a trigger framework to save on run times if they become prohibitive
  • Disabling batch chaining or other aspects of asynchronous processing

In these cases, you still should not use Test.isRunningTest() (at least according to our coding guideline where I work). Instead, you should use a @TestVisible flag in your production code.

public with sharing class MyClass
{
    @TestVisible static Boolean shouldDoStuff = true;
    public static void doStuff()
    {
        if (!shouldDoStuff) return;

        // actual logic
    }
    public static void doNonGatedStuff()
    {
        doStuff();

        // other logic
    }
}
@IsTest class MyClass
{
    @IsTest static void testDoStuff()
    {
        MyClass.shouldDoStuff = false;

        // rest of test
    }
}

Sometimes you will see this logic reversed. For example our typical flag for trigger handlers is called bypassTrigger, which would obviously default to false. You set it to true before inserting some records for setup, then bookend it back to false so that any further operations will still run the trigger.

6
  • P.S. You didn't actually answer the question of "if this is legal?"
    – sfdcfox
    Commented Apr 11, 2019 at 22:46
  • Because the way it was written wouldn't work, I simply showed how it can be done.
    – Adrian Larson
    Commented Apr 11, 2019 at 22:50
  • Thanks for the response. I was actually able to use that static Boolean flag (from Test class) in my actual class, in order to get into a scope and looks like it worked. Do you think am missing something? The procedure that you showed is perfect but I just don't want to make any changes to the prod class since am just supposed to get the coverage up. That's the main reason for this question. Thanks again.
    – apz
    Commented Apr 12, 2019 at 3:14
  • It shouldn't work.
    – Adrian Larson
    Commented Apr 12, 2019 at 3:22
  • So you're saying 'myTestClass.mySwitch' will throw an error if it's used outside the test context?
    – apz
    Commented Apr 12, 2019 at 3:24
1

No, it is not valid. You cannot access any variables or methods inside a class marked @isTest outside of a test context. Instead, you need to place the static variable inside the actual class, then modify it in the test class:

@isTest
public class myTestClass{
    public static testMethod void myTestMethod1(){
        // code //
    }
    public static testMethod void myTestMethod2(){
        actualClass.mySwitch = true;
        // code //
    }
}

public class actualClass{
    @TestVisible static Boolean mySwitch = false;
    public void method2(){
      if(mySwitch){
          //do something from myTestMethod2
      }
    }
}

You can use @TestVisible to prevent accessing the variable outside of testing context.

4
  • Thanks for the response. I was able to use a static variable from a test class in a prod class. Is this something which is frowned upon or is just NOT allowed? If it's the latter then it should thrown an error before saving, right? It ran successfully and in fact got what I was hoping for.
    – apz
    Commented Apr 12, 2019 at 3:21
  • @Apz No, it shouldn't work. I tried this and got a compilation error.
    – sfdcfox
    Commented Apr 12, 2019 at 3:23
  • Sorry to bug but I checked it in my developer org and sandbox, it works fine for me.
    – apz
    Commented Apr 12, 2019 at 3:43
  • @Apz Not sure how you managed to do it--it is not allowed. Do not try to do it.
    – sfdcfox
    Commented Apr 12, 2019 at 3:48

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .