code: def test_CloneWithArgs(self) -> None:
      config1 = OptimizationConfig(
          objective=self.objective,
          outcome_constraints=self.outcome_constraints,
          risk_measure=self.single_output_risk_measure,
      )
      config2 = OptimizationConfig(
          objective=self.objective,
      )
      config3 = OptimizationConfig(
          objective=self.objective,
          risk_measure=_NO_RISK_MEASURE.clone(),
      )
  
      # Empty args produce exact clone
      self.assertEqual(
          config1.clone_with_args(),
          config1,
      )
  
      # None args not treated as default
      self.assertEqual(
          config1.clone_with_args(
              outcome_constraints=None,
              risk_measure=None,
          ),
          config2,
      )
  
      # Arguments that has same value with default won't be treated as default
      self.assertEqual(
          config1.clone_with_args(
              outcome_constraints=None,
              risk_measure=config3.risk_measure,
          ),
          config3,
      )
  
imports: from ax.core.metric import Metric
  from ax.core.objective import MultiObjective, Objective, ScalarizedObjective
  from ax.core.optimization_config import _NO_RISK_MEASURE, MultiObjectiveOptimizationConfig, OptimizationConfig
  from ax.core.outcome_constraint import ObjectiveThreshold, OutcomeConstraint, ScalarizedOutcomeConstraint
  from ax.core.risk_measures import RiskMeasure
  from ax.core.types import ComparisonOp
  from ax.exceptions.core import UserInputError
  from ax.utils.common.testutils import TestCase
label_desc: Use image node_id 6 for calling the OptimizationConfigTest obj's underlying member method code with example usage: obj.test_CloneWithArgs() without return types