code: def test_resolve_spark_submit_env_vars_use_krb5ccache_missing_principal(
      self, mock_get_madantory_value
  ):
      mock_principle = "airflow"
      mock_get_madantory_value.return_value = mock_principle
      hook = SparkSubmitHook(
          conn_id="spark_yarn_cluster",
          principal=None,
          use_krb5ccache=True,
      )
      mock_get_madantory_value.assert_called_with(
          "kerberos", "principal"
      )
      assert hook._principal == mock_principle
  
imports: from __future__ import annotations
  import os
  from io import StringIO
  from unittest.mock import call, patch
  import pytest
  from airflow.exceptions import AirflowException
  from airflow.models import Connection
  from airflow.providers.apache.spark.hooks.spark_submit import SparkSubmitHook
  from airflow.utils import db
label_desc: Use image node_id 4 for calling the TestSparkSubmitHook obj's underlying member method code with example usage: obj.test_resolve_spark_submit_env_vars_use_krb5ccache_missing_principal(mock_get_madantory_value) without return types